2016-05-30 9 views
1

Я пытаюсь отобразить коллекцию в базу данных, используя hibernate и postgresql.Значение повторяющегося ключа Postgresql-Hibertnate нарушает единственное ограничение

Цель:Создайте таблицу базы данных вручную для коллекций и не используйте конфигурацию hbm2ddl.auto.

Таблицы базы данных

CREATE TABLE patients(
    patient_id BIGSERIAL NOT NULL, 
    first_name VARCHAR(255) NOT NULL, 
    last_name VARCHAR(255) NOT NULL, 
    PRIMARY KEY(patient_id)); 

    CREATE TABLE address (
    patient_id BIGINT NOT NULL, 
    city VARCHAR(255), 
    province VARCHAR(255), 
    PRIMARY KEY(patient_id), 
    CONSTRAINT testcollection FOREIGN KEY(patient_id) REFERENCES patients(patient_id)); 

Java Code Класс Patient

@Entity 
@Table(name = "patients") 
public class Patient { 

    @Id 
    @GenericGenerator(name = "primaryIncrement", strategy = "increment") 
    @GeneratedValue(generator = "primaryIncrement") 
    @Column(name = "patient_id") 
    private long patientID; 

    @Column(name = "first_name") 
    private String firstName; 

    @Column(name = "last_name") 
    private String lastName; 

    @ElementCollection 
    @JoinTable(name="address", [email protected](name = "patient_id")) 
    private Collection<Address> listOfAddresses = new ArrayList<Address>(); 

(методы получения и установки опущена)

Адрес Класс

@Embeddable 
public class Address { 

    @Column(name = "city") 
    private String city; 

    @Column(name = "province") 
    private String province; 

HibernateServletTest Класс

Configuration config = new Configuration(); 

     config.configure("hibernate.cfg.xml"); 

     SessionFactory sessionFactory = config.buildSessionFactory(); 

     Session session = sessionFactory.openSession(); 

     Transaction transaction = session.getTransaction(); 
     transaction.begin(); 

     Patient patient = new Patient(); 
     Address address = new Address(); 
     Address homeAddress = new Address(); 
     patient.setFirstName("Ron"); 
     patient.setLastName("Weasly"); 
     address.setCity("Diagon Alley"); 
     address.setProvince("london"); 
     homeAddress.setCity("Abbey Road"); 
     homeAddress.setProvince("Chelsea"); 
     patient.getListOfAddresses().add(address); 
     patient.getListOfAddresses().add(homeAddress); 

     session.save(patient); 
     transaction.commit(); 
     session.close(); 

     System.out.println("Successfully Saved!"); 

После запуска кода я обнаружил исключение

org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "address_pkey" Detail: Key (patient_id)=(0) already exists.

Исходя из StackTrace, таблица базы данных адресов использует patient_id, что уже существует.

Мои вопросы: Как я могу сопоставить первичный ключ таблицы пациента с внешним ключом в таблице адресов? Я считаю, что моя ошибка была в синтаксисе моей базы данных, но я не знаю, какая часть не так.

ответ

0

В вашей адресной таблице ваш patient_id является первичным ключом. Вы не можете вставить два адреса для одного пациента. Попробуйте вставить один адрес.

Смежные вопросы

 Смежные вопросы