gpt4 book ai didi

Hibernate saveorUpdate方法问题

转载 作者:行者123 更新时间:2023-12-03 00:02:52 24 4
gpt4 key购买 nike

我正在尝试使用 Hibernate(第一次是数据库端),并且在选择使用 saveOrUpdate 或 Save.Update 的最佳方式时感到有些震惊我有一个目标 POJO 类及其其他属性,需要与目标实体一起更新。我正在导入一个 XML 文件,并使用以下代码来更新/保存目标实体及其属性类。

try{
getSessionFactory().getCurrentSession().beginTransaction();
getSessionFactory().getCurrentSession().saveOrUpdate(entity);
getSessionFactory().getCurrentSession().getTransaction().commit();
}
catch(Exception e){
getSessionFactory().getCurrentSession().getTransaction().rollback();
}
finally{
getSessionFactory().close();
}

一切都工作正常,直到我使用相同的 session 实例。但后​​来当我使用相同的 XML 文件更新某些属性的目标 PO 时,出现以下错误。

SEVERE: Duplicate entry 'MNLI' for key 'DESTINATIONID'
9 Jan, 2011 4:58:11 PM org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2242)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2678)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79)

我使用 UUID 作为目标表的主键,并且在目标表中我有一个唯一的目标 id。但我可以理解,在第二种情况下,hibernate 无法找到是否已存在该条目的条目数据库中的相同目标并尝试执行插入语句而不是更新。

一个可能的解决方案是我可以使用destinationid来检查是否已经存在具有给定id的目的地,并根据结果我可以发出保存或更新命令。我的问题是这可以通过任何其他好方法来实现吗?

提前致谢

最佳答案

saveOrUpdate() 操作的语义如下(请参阅 11.7. Automatic state detection ):

  • if the object is already persistent in this session, do nothing
  • if another object associated with the session has the same identifier, throw an exception
  • if the object has no identifier property, save() it
  • if the object's identifier has the value assigned to a newly instantiated object, save() it
  • if the object is versioned by a or , and the version property value is the same value assigned to a newly instantiated object, save() it
  • otherwise update() the object

因此,看起来主键或版本值在导入 XML 文件期间丢失了。

关于Hibernate saveorUpdate方法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4639180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com