java - hibernate ,父/子混淆

标签 java database hibernate

我有一个简单的对象关系,我希望坚持 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/

相关文章:

java - java中默认和生成的串行版本uid有什么区别?

java - 给定两个随机整数数组,打印它们的交集。也就是说,打印两个给定数组中存在的所有元素

java - 如何从 java logger api 中删除换行符?

ruby-on-rails - 为什么我无法使用 "rake db:create"创建数据库?

mysql - 如何从表中获取评论和评论回复

database - 在数据库中存储图像 - 是还是否?

java - 如何使用 Hibernate 和 postgresql 为一对多关系实现每个表的自动递增 id 字段

java - 您是否成功地使用了 Spring 和 Hibernate Web 应用程序

java - 如何从 JavaScriptInterface 启动抽屉导航

java - Kotlin 注释不在 fieldDecleration 或编译的 java 中