Hibernate注释多对一,而不是将子项添加到父级集合 [英] Hibernate annotated many-to-one not adding child to parent Collection

查看:72
本文介绍了Hibernate注释多对一,而不是将子项添加到父级集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下带注释的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(){返回小猫; }

$ b @Entity
公共类小猫{
@Column(name =ID)@GeneratedValue(strategy = GenerationType.AUTO)@Id
私人长ID;

@ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
私人猫猫;

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,我猫上的一套小猫应该包含新的小猫。但是,在下面的测试中

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

猫猫=新猫();
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));

$ / code>

即使重新查询Cat后,Set仍为空:

  //在tx.commit()和断言之前添加
cat =(Cat)session.get(Cat.class, cat.getId());

我对Hibernate的期望太高了吗?或者是我自己负责管理收藏的负担? (注释)文档不会生成任何表明我需要在父对象上创建方便的 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); 


I have the following annotated Hibernate entity classes:

@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; }
}

My intention here is a bidirectional one-to-many/many-to-one relationship between Cat and Kitten, with Kitten being the "owning side".

What I want to happen is when I create a new Cat, followed by a new Kitten referencing the Cat, the Set of kittens on my Cat should contain the new Kitten. However, this does not happen in the following 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));
}

Even after re-querying the Cat, the Set is still empty:

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

Am I expecting too much from Hibernate here? Or is the burden on me to manage the Collection myself? The (Annotations) documentation doesn't make any indication that I need to create convenience addTo*/removeFrom* methods on my parent object.

Can someone please enlighten me on what my expectations should be from Hibernate with this relationship? Or if nothing else, point me to the correct Hibernate documentation that tells me what I should be expecting to happen here.

What do I need to do to make the parent Collection automatically contain the child Entity?

解决方案

It won't automatically add it. You have to add it yourself.

I wouldn't directly call Kitten.setCat() either. The typical pattern for this is to put a method in Cat like:

public void addKitten(Kitten kitten) {
  if (kittens == null) {
    kittens = new HashSet<Kitten>();
  }
  kittens.add(kitten);
  kitten.setCat(this);
}

and then simply call:

cat.addKitten(kitten);

这篇关于Hibernate注释多对一,而不是将子项添加到父级集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆