2016-05-30 1 views
1

J'essaye de mapper une collection dans une base de données en utilisant hibernate et postgresql.Postgresql-Hibertnate valeur de clé en double viole contrainte unique

Objectif:Créez la table de base de données manuellement pour les collections et n'utilisez pas la configuration hbm2ddl.auto.

Tables de base de données

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)); 

code Java Classe 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>(); 

(getter et setter omis)

Adresse classe

@Embeddable 
public class Address { 

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

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

HibernateServletTest Classe

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!"); 

Lors de l'exécution du code I a rencontré une exception

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

Sur la base de la stacktrace, la table de base de données d'adresses utilise un patient_id qui existe déjà.

Mes questions sont, comment puis-je mapper la clé primaire de la table du patient à la clé étrangère dans la table d'adresses? Je crois que mon erreur était dans la syntaxe de ma base de données, mais je ne sais pas quelle partie est erronée.

Répondre

0

Dans votre table d'adresses, votre patient_id est la clé primaire. Vous ne pouvez pas insérer deux adresses pour le même patient_id. Essayez d'insérer une adresse unique.