Hibernate hat viele-zu-eins-Kommentare hinzugefügt, ohne dass ein untergeordnetes Element zur übergeordneten Sammlung hinzugefügt wurde.

Ich habe die folgenden mit Annotationen versehenen Hibernate-Entitätsklassen:

@Entity
public class Cat {
    @Column(name = "ID") @GeneratedValue(strategy = GenerationType.AUTO) @Id
    private Long id;

    @OneToMany(mappedBy = "cat", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<Kitten> kittens = new HashSet<Kitten>();

    public void setId(Long id) { this.id = id; }
    public Long getId() { return id; }
    public void setKittens(Set<Kitten> kittens) { this.kittens = kittens; }
    public Set<Kitten> getKittens() { return kittens; }
}

@Entity
public class Kitten {
    @Column(name = "ID") @GeneratedValue(strategy = GenerationType.AUTO) @Id
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Cat cat;

    public void setId(Long id) { this.id = id; }
    public Long getId() { return id; }
    public void setCat(Cat cat) { this.cat = cat; }
    public Cat getCat() { return cat; }
}

Meine Absicht ist hier eine bidirektionale Eins-zu-Viele / Viele-zu-Eins-Beziehung zwischen Katze und Kätzchen, wobei Kätzchen die "Besitzerseite" ist.

ch möchte, dass ich eine neue Katze erstelle, gefolgt von einem neuen Kätzchen, das auf die Katze verweisdas Katzenset auf meiner Katze sollte das neue Kätzchen enthalten. Dieses passiert nicht im folgenden Test:

@Test
public void testAssociations()
{
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    Transaction tx = session.beginTransaction();

    Cat cat = new Cat();
    session.save(cat);

    Kitten kitten = new Kitten();
    kitten.setCat(cat);
    session.save(kitten);

    tx.commit();

    assertNotNull(kitten.getCat());
    assertEquals(cat.getId(), kitten.getCat().getId());
    assertTrue(cat.getKittens().size() == 1); // <-- ASSERTION FAILS
    assertEquals(kitten, new ArrayList<Kitten>(cat.getKittens()).get(0));
}

Selbst nach einer erneuten Abfrage der Katze ist das Set noch leer:

// added before tx.commit() and assertions
cat = (Cat)session.get(Cat.class, cat.getId());

Am erwarte ich hier zu viel von Hibernate? Oder obliegt es mir, die Sammlung selbst zu verwalten? Das (Anmerkungen) Dokumentation gibt nicht an, dass ich Convenience erstellen mussaddTo*/removeFrom* Methoden für mein übergeordnetes Objekt.

Kann mir jemand bitte erklären, welche Erwartungen ich in Bezug auf diese Beziehung an Hibernate habe? Oder verweisen Sie mich auf die richtige Hibernate-Dokumentation, die mir sagt, was ich hier erwarten sollte.

Was muss ich tun, damit die übergeordnete Sammlung automatisch die untergeordnete Entität enthält?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage