次の注釈付き Hibernate エンティティ クラスがあります。
@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; }
}
ここでの私の意図は、Cat と Kitten の間の双方向の 1 対多/多対 1 の関係であり、Kitten が「所有側」になります。
私がやりたいことは、新しい Cat を作成し、続いてその Cat を参照する新しい Kitten を作成したときに、私の Cat の子猫のセットに新しい Kitten が含まれている必要があることです。ただし、これは次のテストでは発生しません。
@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));
}
Cat を再クエリした後でも、Set はまだ空です。
// added before tx.commit() and assertions
cat = (Cat)session.get(Cat.class, cat.getId());
ここで Hibernate に期待しすぎていますか? それとも、コレクションを自分で管理するのは自分の負担ですか? (注釈)ドキュメントには、親オブジェクトに便利なaddTo*
/メソッドを作成する必要があることは示されていません。removeFrom*
この関係でHibernateに期待することについて誰か教えてもらえますか? または、他に何もない場合は、ここで何が起こると予想すべきかを教えてくれる正しい Hibernate ドキュメントを教えてください。
親コレクションに子エンティティが自動的に含まれるようにするにはどうすればよいですか?