2013-07-11 88 views
0

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

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在将数据保存到数据库中之后仍然关注对象的关键字段 - 甚至在它应该之后,并且在提交时抱怨它。

我希望我应该留在代码中的对象一旦我保存它,这是没有道理的。

我想知道它背后是什么。

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

回答

0

发生什么事情是在您拨打session.save(anObj)后,实体对象变成了持久对象 - 意味着任何后续对其状态的修改都将被Hibernate检测到并同步到数据库(有时会跟踪到该对象)。

你或许可以保存多行不通过分离,更新和合并为每一个新的数据库行重新创建新的对象,但我会说这违背了使用ORM的目的摆在首位(对象关系映射)。

我相信休眠的目的是使Java程序员可以映射存储在数据库行作为一个Java对象(反之亦然)

+0

THX的答案域对象。那么在这种情况下 - 是否有办法将对象直接绑定到某种“保存模式”,以便HN在检测到发生的所有事情的同时,每次发出新的保存信号那个同样的东西?否则,核心代码中的所有干扰都不会带来太大的收益。 – Roam

+0

我会说你应该考虑一下你的代码的设计模式。通常,Hibernate是在DAO(数据访问对象)类中实现的。从数据库中获取/更新时,只保留实体持久性,否则应用程序始终与分离的实例一起工作(如果对象被修改,则不需要DB操作) – gerrytan

+0

再次感谢。这是一个很好的角度。 – Roam

相关问题