gpt4 book ai didi

java - hibernate ,父/子混淆

转载 作者:搜寻专家 更新时间:2023-10-30 23:20:26 25 4
gpt4 key购买 nike

我有一个简单的对象关系,我希望坚持 hibernate 。

基本上,它是一个父级,其中包含一个子级集合。我只想加载父级(如果存在),否则创建它、向其添加元素并保存它。

这是在 GWT 环境中完成的,所以我将 ChildDTO 传递给此方法,它基本上只是 Child 类的非持久版本(与 gwts RPC 序列化不兼容)。

public Integer testHibernate(Integer parentId, ChildDTO[] test) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();

Parent model;
if(parentId == null) {
// if the parentId is null, create new instance
model = new Parent );
}
else {
model = (Parent) hib.load(Parent.class, dto.getId());
}

model.setName("dummy name");

for(int i = 0; i < test.length) {
model.addChild(new Child(test[i].getId(), test[i].getName()));
}

hib.save(model);
hib.getTransaction().commit();

return model.getId();
}

是的,这对于创建没有 child 的新 parent 来说效果很好。如果我只是将一个 child 添加到现有 parent ,它也可以正常工作。但是,如果我添加多个 child ,我会从 hibernate 中收到“无法插入”错误。

另外,如果我尝试只添加一个 child ,到一个已经添加了一个 child 的现有 parent 。我收到“具有相同标识符值的不同对象已与 session 相关联”错误。

附加问题。当只插入一个子节点时,在一个空的父节点上,hibernate 会执行以下操作:

Hibernate: insert into Child(ChildId, ChildName) values (default, ?)
Hibernate: update Parent set ChildId=? where ChildId=?

有什么更新? :S

最佳答案

However, if i add more than one child, i get a "could not insert" error from hibernate.

从问题看来,父子关系已设置为一对一而不是一对多。首先确保它在您的 hibernate 配置文件中是正确的。

<set name="children">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>

Also, if I try adding just one child, to a already existing parent, which already have one child added. I get a "a different object with the same identifier value was already associated with the session" error.

在下面的代码片段中,您只是保存带有 Id 的 child ,而不检查它是否已经存在。请记住,Child 也作为一行存储在数据库中。所以你需要检查数据库中是否存在该对象。

for(int i = 0; i < test.length) {
model.addChild(new Child(test[i].getId(), test[i].getName()));
}

When inserting just one child, on a empty parent, hibernate does the following:

这是合乎逻辑的,第一个 INSERT 语句对应于 Child 对象的新行。第二个 UPDATE 语句对应于在 ParentChild 对象之间建立链接。

您可以通过设置inverse 关系来优化它。在这种情况下,Child 表存储 parent_id,因此导致一个 INSERT 语句而不是两个语句。

<set name="children" inverse="true">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>

请参阅 Hibernate 文档中的此链接,该链接清楚地解释了如何设置和实现 Parent-Child 关系:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/example-parentchild.html#example-parentchild-bidir

关于java - hibernate ,父/子混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7325474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com