Hibernate - Eins-zu-viele-relation - Fremdschlüssel-immer "null"
Habe ich zwei wirklich einfache Objekte und ein Objekt enthalten sollte, die andere in einer "eins-zu-viele" - Beziehung in einem Satz. Die Objekte korrekt eingefügt in der Datenbank, aber der Fremdschlüssel in der "Kinder" - Tabelle ist immer "null".
Ich kann nicht herausfinden, warum:
Dies ist das test-Objekt und halten Sie die Kinder in seinem Satz:
@Entity
@Table(name="test")
public class TestObj {
public TestObj(){}
private Long id;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
private Set<Children> children = new HashSet<Children>();
@OneToMany(mappedBy = "testObj", cascade = CascadeType.ALL)
public synchronized Set<Children> getChildren() {
return children;
}
public synchronized void setChildren(Set<Children> children) {
this.children = children;
}
public void addChildren(Children child){
children.add(child);
}
}
Dies ist die Kinder-Objekt und es hält einen zurück-link auf die "TestObj":
@Entity
@Table(name = "children")
public class Children {
public Children(){}
private Long id;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
private TestObj testObj;
@ManyToOne
@JoinColumn
public TestObj getTestObj() {
return testObj;
}
public void setTestObj(TestObj testObj) {
this.testObj = testObj;
}
}
Ich anhalten, diese Objekte mit diesem code:
EntityManagerFactory entityManagerFactory = HibernateEntityMangerSingelton.getEntityManagerFactory();
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
TestObj user = new TestObj();
Children child = new Children();
user.addChildren(child);
try {
entityManager.persist(user);
entityManager.getTransaction().commit();
} catch (Exception e) {
System.out.println(e);
}finally{
entityManager.close();
}
Kann mir erklären, warum dies passiert ist?
- können Sie Ihre Antwort?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es ganz einfach: Sie nie initialisieren der
testObj
Feld inChildren
(die benannt werden sollten Kind, BTW).Children.testObj
ist der Besitzer des Vereins, und ist das Feld zugeordnet ist, das an die join-Spalte, also, wenn es null ist, wird die join-Spalte null.Ich hatte ein ähnliches problem, das ich gelöst durch den Aufruf von setter von der Eigentümer-Seite. Die 2 metods seting und das hinzufügen der Kinder zu den TestObj sollten verändert werden, so dass die TestObj initialisiert wird an den Besitzer der Seite:
Die zweite Methode: