在Hibernate中保存同一实例上的多个记录

时间:2013-07-11 23:57:40

标签: hibernate primary-key

代码

    for (int i=0; i<10; i++) {
        SomeClass anObj = new SomeClass();
        anObj.setField(i);
        anObj.setAnotherField("XYZ"+i);
        session.save(anObj);
    }
    session.getTransaction().commit();

正在运行,没有错误,并将10行添加到表中,这就是我想要的。 字段 SomeClass 的主键。

当我把声明移到外面时:

    SomeClass anObj = new SomeClass();
    for (int i=0; i<10; i++) {
        anObj.setField(i);
        anObj.setAnotherField("XYZ"+i);
        session.save(anObj);
    }
    session.getTransaction().commit();

我收到一条错误,“SomeClass实例的标识符已被更改”。

我从中“读到”的是,Hibernate在将数据保存到数据库之后仍然密切关注对象的关键字段 - 甚至在它应该之后,并且在提交时抱怨它。

我希望在保存它之后,我应该单独使用代码中的对象,这没有意义。

我想知道背后是什么。

有没有办法 - save()的属性或其他保存模式来解决这个问题?我不希望在循环的每次迭代中重新声明 anObj

1 个答案:

答案 0 :(得分:0)

正在发生的事情是在你调用session.save(anObj)之后,实体对象变成了pesistent - 这意味着Hibernate将检测到对其状态的任何后续修改并同步到数据库(有时在轨道上)。

您可以通过分离,更新和合并每个新数据库行来保存多行而无需重新创建新对象,但我认为这首先会破坏使用ORM(对象关系映射)的目的。 / p>

我相信hibernate的设计是为了让Java程序员可以将存储在数据库行中的域对象映射为一个java对象(反之亦然)