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:
- J'utilise JPA seulement
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
);
Utilisez-vous Hibernate et JPA ou seulement JPA? – Gatusko
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 ?? –
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. –