0

编码

    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 行添加到我想要的表中。fieldSomeClass的主键。

当我将声明移到外面时:

    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 。

4

1 回答 1

0

发生的事情是在您调用 之后session.save(anObj),实体对象变得持久化——这意味着 Hibernate 将检测到对其状态的任何后续修改并同步到数据库(有时会沿着轨道)。

您可以通过分离、更新和合并每个新的数据库行来保存多行而无需重新创建新对象,但我想说这首先违背了使用 ORM(对象关系映射)的目的。

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

于 2013-07-12T00:13:02.097 回答