java – Hibernate注释多对一,不将子项添加到父集合

前端之家收集整理的这篇文章主要介绍了java – Hibernate注释多对一,不将子项添加到父集合前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下带注释的Hibernate实体类:
  1. @Entity
  2. public class Cat {
  3. @Column(name = "ID") @GeneratedValue(strategy = GenerationType.AUTO) @Id
  4. private Long id;
  5.  
  6. @OneToMany(mappedBy = "cat",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
  7. private Set<Kitten> kittens = new HashSet<Kitten>();
  8.  
  9. public void setId(Long id) { this.id = id; }
  10. public Long getId() { return id; }
  11. public void setKittens(Set<Kitten> kittens) { this.kittens = kittens; }
  12. public Set<Kitten> getKittens() { return kittens; }
  13. }
  14.  
  15. @Entity
  16. public class Kitten {
  17. @Column(name = "ID") @GeneratedValue(strategy = GenerationType.AUTO) @Id
  18. private Long id;
  19.  
  20. @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
  21. private Cat cat;
  22.  
  23. public void setId(Long id) { this.id = id; }
  24. public Long getId() { return id; }
  25. public void setCat(Cat cat) { this.cat = cat; }
  26. public Cat getCat() { return cat; }
  27. }

我的意图是Cat和Kitten之间的双向一对多/多对一关系,其中Kitten是“拥有者”.

我想要发生的是当我创造一只新猫,然后是一只引用猫的新小猫时,我猫上的小猫套装应该包含新的小猫.但是,在以下测试中不会发生这种情况:

  1. @Test
  2. public void testAssociations()
  3. {
  4. Session session = HibernateUtil.getSessionFactory().getCurrentSession();
  5. Transaction tx = session.beginTransaction();
  6.  
  7. Cat cat = new Cat();
  8. session.save(cat);
  9.  
  10. Kitten kitten = new Kitten();
  11. kitten.setCat(cat);
  12. session.save(kitten);
  13.  
  14. tx.commit();
  15.  
  16. assertNotNull(kitten.getCat());
  17. assertEquals(cat.getId(),kitten.getCat().getId());
  18. assertTrue(cat.getKittens().size() == 1); // <-- ASSERTION FAILS
  19. assertEquals(kitten,new ArrayList<Kitten>(cat.getKittens()).get(0));
  20. }

即使在重新查询Cat之后,Set仍然是空的:

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

我对Hibernate的期望太高了吗?或者是我自己管理收藏品的负担? (Annotations) documentation没有任何迹象表明我需要在父对象上创建方便的addTo * / removeFrom *方法.

有人可以告诉我Hibernate对这种关系的期望是什么吗?或者,如果没有别的,请指出正确的Hibernate文档,告诉我在这里应该发生什么.

我需要做什么才能使父集合自动包含子实体?

解决方法

它不会自动添加它.你必须自己添加它.

我也不会直接调用Kitten.setCat().典型的模式是在Cat中添加一个方法

  1. public void addKitten(Kitten kitten) {
  2. if (kittens == null) {
  3. kittens = new HashSet<Kitten>();
  4. }
  5. kittens.add(kitten);
  6. kitten.setCat(this);
  7. }

然后简单地打电话:

  1. cat.addKitten(kitten);

猜你在找的Java相关文章