我有以下带注释的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的新 小猫时,我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之后,集合仍然为空:
// added before tx.commit() and assertions
cat = (Cat)session.get(Cat.class, cat.getId());
我在这里对Hibernate期望过高吗?还是我自己来管理Collection的负担?在(注释)文档不作任何迹象表明我需要创造便利addTo*
/
removeFrom*
我的父对象的方法。
有人可以通过这种关系启发我对Hibernate的期望吗?或者,如果没有其他要求,请指向正确的Hibernate文档,该文档告诉我在这里应该发生的情况。
我该怎么做才能使父集合自动包含子实体?
它不会自动添加。您必须自己添加。
我也不会直接打电话Kitten.setCat()
。典型的html" target="_blank">模式是将方法放入Cat
:
public void addKitten(Kitten kitten) {
if (kittens == null) {
kittens = new HashSet<Kitten>();
}
kittens.add(kitten);
kitten.setCat(this);
}
然后只需调用:
cat.addKitten(kitten);
问题内容: 我有以下带注释的Hibernate实体类: 我的意图是在Cat和Kitten之间建立双向的一对多/多对一关系,Kitten是“拥有方”。 我想发生的事情是,当我创建一个新的Cat,然后是一个引用该Cat的新 小猫时,我Cat上的这组小猫应该包含新的Kitten 。但是,在以下测试 中不会发生这种情况 : 即使在重新查询Cat之后,集合仍然为空: 我在这里对Hibernate期望过高吗?
我有一个JavaAPI(使用Spring Framework),我的前端使用它来创建新的父对象(json),其中包含一个新的子对象列表,如下所示: 如您所见,没有ID,因为我即将保存它们,并且数据库应该生成ID。 父实体在后端具有以下代码: 在我调用存储库上的父级保存操作后,我可以在数据库中找到子元素(所以级联工作),但是数据库中的子级的父级列为空,因此当我获取父级时,它的子级列表显示为空。 我可
在我的jpa映射中,我试图将带有一个主键的父类映射到带有复合键的子类,但似乎插入了错误的表,它已经生成了2个表,但不幸的是我没有绑定外键(policy_value_summary_id) 我试图用策略值(子类)保存策略摘要值(父),如下所示 下面是输出给我的错误
我有一些关于“级联”的问题,在我的项目中,我有类别类,每个类可以是父类或子类。但我在同一个类中定义了哪一个是父母还是孩子。父母和孩子之间存在一对多的关系。这是我的实体类 我的问题是;当我删除子类别时,它的成功并没有问题。如果父类别有子类别,则无法删除父类别。 错误消息; Servlet.service()的servlet[调度Servlet]在上下文中与路径[]抛出异常[请求处理失败;嵌套异常or
问题内容: 下面是我桌上的东西。 myTable 我想要的是如下使用MYSQL。 请让我知道在MYSQL中是否可行。输出类似于 TREE 。 更新1 如果我得到如下所示的新表也可以,因此我可以使用 此示例 。 注意: 我已从1开始级别(例如,我的级别从0开始)。如果我得到这个从0开始的新表也很好。 问题答案: 尽管您无法使用单个查询进行操作,但是可以使用存储过程进行操作…唯一的先决条件是,您需要在
假设我有一个应用程序来处理一系列的书。 我的应用程序允许向库中添加新书。创建书籍时,用户可以在列表中选择作者,如果作者尚不存在,则可以将其添加到列表中,并在表单字段中提供其姓名。填写表单后,数据将发送到WS,类似 然后我将json映射到我的实体中 书: 作者 这不会像用户尝试添加新作者一样工作,当我尝试. sav()时,我会收到错误: 组织。冬眠TransientPropertyValueExce