Java 使用不同的值休眠同一对象

Java 使用不同的值休眠同一对象,java,hibernate,Java,Hibernate,比如说,我有一个带有特定列的类 Class A { private String A; private String B; private String C; // Getter Setter of respectives } 现在发生了什么,我有相同的列A和列B的值,只有列C的值发生了变化。所以我做了下面的事情 A a = new A(); a.setA(..); a.setB(..); for(i=0;i<length;i++){ a.s

比如说,我有一个带有特定列的类

Class A
{
    private String A;
    private String B;
    private String C;

    // Getter Setter of respectives
}
现在发生了什么,我有相同的列A和列B的值,只有列C的值发生了变化。所以我做了下面的事情

A a = new A();
a.setA(..);
a.setB(..);

for(i=0;i<length;i++){
     a.setC(..);

     getHibernateTemplate.saveOrUpdate(a);

     // or something like this
     // A a1 = new A();
     // a1 = a;
     // a1. setC(..);
     // getHibernateTemplate.saveOrUpdate(a1);

}
A A=新A();
a、 刚毛(…);
a、 挫折(……);
对于(i=0;iYes)。尝试
save(a)
而不是
save或update(a)

是。请尝试
save(a)
而不是
save或update(a)


您尚未描述实际的实体详细信息。如果要使用相同的值保存实体,请将标识符属性设置为
null

根据文件-

saveOrUpdate()

  • 如果对象在此会话中已持久化,则不执行任何操作
  • 如果与会话关联的另一个对象具有相同的 标识符,引发异常
  • 如果对象没有标识符属性,则保存它()
  • 如果对象的标识符的值已分配给新的 实例化对象,保存()它
  • 如果对象的版本由or控制,则 版本属性值与分配给新版本的属性值相同 实例化对象,保存()它
  • 否则,更新()对象
saveOrUpdateAll()

  • 根据其id(与配置的“未保存值”匹配)保存或更新所有给定的持久实例。将实例与当前Hibernate会话关联
[如果有效,可以为您的其他人尝试此功能]


编辑:这是我的疏忽,我没有仔细检查你的代码。 您已在for循环外部定义了对象
A
,因此在每次迭代中都会更新相同的对象。请尝试下面的代码,可能会有所帮助

for(i=0;i<length;i++){
A a = new A();  //-- Create new object for each iteration
a.setA(..);
a.setB(..);
a.setC(..);

getHibernateTemplate.saveOrUpdate(a);
}

for(i=0;i您尚未描述实际的实体详细信息。如果要使用相同的值保存实体,请将标识符属性设置为
null

根据文件-

saveOrUpdate()

  • 如果对象在此会话中已持久化,则不执行任何操作
  • 如果与会话关联的另一个对象具有相同的 标识符,引发异常
  • 如果对象没有标识符属性,则保存它()
  • 如果对象的标识符的值已分配给新的 实例化对象,保存()它
  • 如果对象的版本由or控制,则 版本属性值与分配给新版本的属性值相同 实例化对象,保存()它
  • 否则,更新()对象
saveOrUpdateAll()

  • 根据其id(与配置的“未保存值”匹配)保存或更新所有给定的持久实例。将实例与当前Hibernate会话关联
[如果有效,可以为您的其他人尝试此功能]


编辑:这是我的疏忽,我没有仔细检查你的代码。 您已在for循环外部定义了对象
A
,因此在每次迭代中都会更新相同的对象。请尝试下面的代码,可能会有所帮助

for(i=0;i<length;i++){
A a = new A();  //-- Create new object for each iteration
a.setA(..);
a.setB(..);
a.setC(..);

getHibernateTemplate.saveOrUpdate(a);
}

for(i=0;iThanks,我对您的解决方案投了赞成票,但这对我不起作用,这只是我的代码的一个概念,因为我无法在这里解释整个代码,但是在我的代码中,我使用saveOrUpdateAll()保存整个集合的方法,hibernateTemplate类没有saveAll()方法,在这种情况下,我应该怎么做?我以前考虑过这个问题,我在这里也问过相关的问题。谢谢,我对你的解决方案投了赞成票,但这对我来说不起作用,这只是我的代码的一个概念,因为我无法在这里解释整个代码,但是在我的代码中,我使用方法通过saveOrUpdateAl保存整个集合l()和hibernateTemplate类没有saveAll()方法,在这种情况下,我应该怎么做?我以前考虑过这个问题,我在这里也问过相关的问题。我尝试过将标识符值设置为null,但它不起作用。这会起作用,但我不想设置setA()和setB()这也是我关心的。@为此,您可以在entity中显式定义方法,以返回具有默认值的新对象或适当的构造函数,或者可以
clone()
&然后只能设置要更改的必填字段。我尝试将标识符值设置为null,但无效。这样可以,但我不想设置setA()和setB()同样,这也是我关心的。@为此,您可以在entity中显式定义方法,以返回具有默认值或适当构造函数的新对象,或者可以
clone()
&然后只设置要更改的必填字段。