Ho una domanda sul riferimento ParentEntities da bambino entités ir Se ho qualcosa di simile:JPA @OneToMany -> Parent - Bambino di riferimento (chiave esterna)
Parent.java:
@Entity(name ="Parent")
public class Parent {
@Id
@Generate.....
@Column
private int id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "parent")
private Set<Child> children;
simple ... getter and setter ...
}
e il Child.java:
@Entity(name ="Child")
public class Child{
@Id
@Generate....
@Column
private int id;
@ManyToOne
private Parent parent;
... simple getter an setter
}
seguenti tabelle stanno per essere creati:
Parent:
int id
Child:
int id
int parent_id (foreign key: parent.id)
Ok, finora tutto bene. Ma quando si tratta di utilizzare questo riferimento da Java, penserei, si può fare qualcosa di simile.
@Transactional
public void test() {
Parent parent = new Parent();
Child child = new Child();
Set<Child> children = new HashSet<Child>();
children.add(child);
parent.setChildren(children);
entityManager.persist(parent);
}
che porta a questo nella risorsa:
Parent:
id
100
Child
id paren_id
101 100
Ma non questo è il caso, si deve esplicitamente impostare la Capogruppo al Bambino (che, pensavo, il quadro potrebbe probabilmente fare da si).
Così che cosa è realmente nel database è questo:
Parent:
id
100
Child
id paren_id
101 (null)
causa non ho impostato il padre al bambino. Quindi la mia domanda:
Devo davvero fare sth. come questo?
Parent.java:
...
setChildren(Set<Child> children) {
for (Child child : children) {
child.setParent.(this);
}
this.children = children;
}
...
Edit:
In base alle risposte veloci sono stato in grado di risolvere questo problema utilizzando il @JoinColumn sul Entità di Riferimento-Possedere. Se prendiamo l'esempio dall'alto, ho fatto sth. in questo modo:
Parent.java:
@Entity(name ="Parent")
public class Parent {
@Id
@Generate.....
@Column
private int id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name= "paren_id")
private Set<Child> children;
simple ... getter and setter ...
}
E il Child.java:
@Entity(name ="Child")
public class Child{
@Id
@Generate....
@Column
private int id;
... simple getter an setter
}
Ora, se facciamo questo:
@Transactional
public void test() {
Parent parent = new Parent();
Child child = new Child();
Set<Child> children = new HashSet<Child>();
children.add(child);
parent.setChildren(children);
entityManager.persist(parent);
}
Il riferimento è correttamente impostato il genitore:
Parent:
id
100
Child
id paren_id
101 100
Grazie per le risposte.
** hai un genitore sull'entità figlio? ** se sì come hanno configurato.Con nessun genitore ottengo l'errore (_StaleStateException: L'aggiornamento batch ha restituito il conteggio delle righe inatteso dall'aggiornamento [0], il conteggio delle righe effettivo: 0; previsto: 1_). Se aggiungo un genitore senza annotazioni mostra anche l'errore (errore di mappatura). Con l'impostazione @manytoone sul campo padre di child ottengo l'errore su save (_ORA-00904: "REPORT_REPORT_ID": недопустимый идентификатор_). il mio fk e il suo pk su id hanno chiamato report_id ma non so da dove viene report_report_id. – Erlan
(Utilizzo dell'implementazione JPA di EclipseLink). Vale la pena notare che è ancora necessario il parenId privato lungo @Column (name = "paren_id"); mappatura su tuo figlio per questo lavoro. – AfterWorkGuinness