java – Hibernate注释多对一,不将子项添加到父集合
发布时间:2020-05-24 19:46:29 所属栏目:Java 来源:互联网
导读:我有以下带注释的Hibernate实体类: @Entitypublic class Cat { @Column(name = ID) @GeneratedValue(strategy = GenerationType.AUTO) @Id private Long id; @OneToMany(mappedBy = cat, cascade = CascadeTy
|
我有以下带注释的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是“拥有者”. 我想要发生的是当我创造一只新猫,然后是一只引用猫的新小猫时,我猫上的小猫套装应该包含新的小猫.但是,在以下测试中不会发生这种情况: @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的期望太高了吗?或者是我自己管理收藏品的负担? (Annotations) documentation没有任何迹象表明我需要在父对象上创建方便的addTo * / removeFrom *方法. 有人可以告诉我Hibernate对这种关系的期望是什么吗?或者,如果没有别的,请指出正确的Hibernate文档,告诉我在这里应该发生什么. 我需要做什么才能使父集合自动包含子实体? 解决方法它不会自动添加它.你必须自己添加它.我也不会直接调用Kitten.setCat().典型的模式是在Cat中添加一个方法: public void addKitten(Kitten kitten) {
if (kittens == null) {
kittens = new HashSet<Kitten>();
}
kittens.add(kitten);
kitten.setCat(this);
}
然后简单地打电话: cat.addKitten(kitten); (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读
