我有以下带注释的 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 之间的双向一对多/多对一关系,其中 Kitten 是“拥有方”。
我想要发生的事情是,当我创建一个新的 Cat,然后是一个引用该 Cat 的新 Kitten 时,我的 Cat 上的 Set of kittens 应该包含新的 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 文档,它告诉我我应该期待在这里发生什么。
我需要做什么才能使父集合自动包含子实体?