2017-02-07 6 views
0

J'essaie de conserver 3 entités avec une relation un-à-plusieurs, mais je ne peux pas le faire correctement. C'est ce que j'ai:JPA unidirectionnel relation un-à-plusieurs persiste

@Entity 
@Table(name = "tb_person") 
public class Person { 
    @Id 
    @SequenceGenerator(name = "my_seq", sequenceName = "pk_seq", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_seq") 
    @Column(name="person_id") 
    private long personId; 

    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumn(name = "person_id", referencedColumnName = "person_id") 
    private List<Phone> phones; 
} 


@Entity 
@IdClass(PersonBrandId.class) 
@Table(name = "tb_person_phone") 
public class Phone { 
    @Id 
    @Column(name = "retailer_id") 
    private long personId; 

    @Id 
    @Column(name = "brand_code") 
    private String brandCode; 

    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumns({ 
     @JoinColumn(name = "brand_code", referencedColumnName = "brand_code", insertable = false, updatable = false), 
     @JoinColumn(name = "person_id", referencedColumnName = "person_id", insertable = false, updatable = false)}) 
    List<Mobile> mobiles; 

    ...other fields... 
} 

@Entity 
@Table(name = "tb_mobile") 
public class Mobile { 
    @Id 
    @SequenceGenerator(name = "my_seq2", sequenceName = "pk_seq2", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_seq2") 
    @Column(name="mobile_id") 
    private long mobileId; 

    @Column(name = "person_id") 
    private long personId; 

    ...other fields... 
} 

Alors, ce que je suis en train d'atteindre est de persister personne seulement et, parce que la cascade, téléphone et mobile seront automatiquement persistées. Exemple:

Person person = new Person(); 
Phone phone = new Phone(); 
Mobile mobile = new Mobile(); 
phone.getMobiles().add(mobile); 
person.getPhones().add(phone); 

em.persist(person); 

Le problème est que je reçois une erreur indiquant que le tb_person_phone.person_id ne peut pas être nulle. La relation est unidirectionnelle, donc je n'ai pas ajouté le côté ManyToOne.

Afin de répondre à quelques commentaires:

  1. J'utilise JPA seulement
  2. la relation est la suivante:

    personne peut avoir plusieurs téléphone.

    Téléphone a composite clé primaire:

    - person_id in Person 
    
        - brand_code in Brand (a table with a list of brands) 
    

    Mobile a clé primaire: mobile_id

    has two FK: 
    
        - person_id and brand_code both referencing the table Phone 
    

SQL pour générer les tables:

CREATE TABLE "TB_PERSON" 
( "PERSON_ID" NUMBER NOT NULL ENABLE, 
"PERSON_NAME" VARCHAR2(100 BYTE) NOT NULL ENABLE, 
CONSTRAINT "PERSON_PK" PRIMARY KEY ("PERSON_ID") 
); 


CREATE TABLE "TB_PERSON_PHONE" 
( "PERSON_ID" NUMBER NOT NULL ENABLE, 
    "BRAND_CODE" VARCHAR2(30 BYTE) NOT NULL ENABLE, 
    "ATTR1" VARCHAR2(1 BYTE), 
    "ATTR2" VARCHAR2(100 BYTE), 
CONSTRAINT "PERSON_PHONE_PK" PRIMARY KEY ("PERSON_ID", "BRAND_CODE") 
FOREIGN KEY ("PERSON_ID") 
    REFERENCES "TB_PERSON" ("PERSON_ID") ENABLE, 
FOREIGN KEY ("BRAND_CODE") 
    REFERENCES "TB_BRAND" ("BRAND_CODE") ENABLE 
); 


CREATE TABLE "TB_MOBILE" 
( "MOBILE_ID" NUMBER NOT NULL ENABLE, 
"PERSON_ID" NUMBER NOT NULL ENABLE, 
"BRAND_CODE" VARCHAR2(30 BYTE) NOT NULL ENABLE, 
"NUMBER" VARCHAR2(30 BYTE) NOT NULL ENABLE, 
"ATTR1" VARCHAR2(100 BYTE), 
"ATTR2" VARCHAR2(100 BYTE), 
CONSTRAINT "MOBILE_PK" PRIMARY KEY ("MOBILE_ID"), 
CONSTRAINT "MOBILE_UQ" UNIQUE ("NUMBER", "PERSON_ID", "BRAND_CODE") 
USING INDEX (CREATE UNIQUE INDEX "MOBILE_UQ_IDX" ON "TB_MOBILE" ("NUMBER",  "PERSON_ID", "BRAND_CODE"), 
FOREIGN KEY ("PERSON_ID", "BRAND_CODE") 
    REFERENCES "TB_PERSON_PHONE" ("PERSON_ID", "BRAND_CODE") ENABLE 
); 
+0

Utilisez-vous Hibernate et JPA ou seulement JPA? – Gatusko

+0

Comment imaginez-vous que personId et brandCode sont configurés dans Phone? Du point de vue de la modélisation ne sont pas les personnes dans une relation de plusieurs à plusieurs et un téléphone devrait avoir une marque ?? –

+0

Comme je l'ai noté dans mon commentaire précédent, votre code est fondamentalement vicié. Les deux champs ID du téléphone ne peuvent pas être réglés comme par magie. En dehors de cela, je ne comprends pas votre modèle ou votre schéma de base de données. –

Répondre

0

Set @GeneratedValue(strategy = GenerationType.AUTO) pour le primaire clés des deux Mobil Entités e et Phone.

+0

Merci pour votre réponse, mais cela ne fonctionne pas – user1341300

+0

Pouvez-vous partager les requêtes SQL pour ces trois tables sera facile pour moi de déboguer. @ user1341300 – zillani

+0

J'ai ajouté le sql pour générer les tables – user1341300

0

Vous utilisez id personne comme identifiant dans Téléphone classe

@Id 
@Column(name = "retailer_id") 
private long personId; 

lieu une autre colonne comme Id et d'ajouter une stratégie d'identification de génération ou

Person person = new Person(); 

em.persist(person); //< 

Phone phone = new Phone(); 
Mobile mobile = new Mobile(); 
phone.getMobiles().add(mobile); 
person.getPhones().add(phone); 

phone.setPersonId(person.getId()); // < 

em.persist(person); 
+0

Cela signifie que je dois d'abord persister la Personne puis l'appeler à nouveau – user1341300