Hibernate saveOrUpdate填充了主键

时间:2015-02-27 04:22:49

标签: java hibernate

我的桌子有两个字段  id - unique,NotNull和Seq  name - Varchar

在空桌上我发送记录为 id = 1 (Filling the id value manually) name = 'sample'

我使用saveOrUpdate的意图是当DB中没有Id:1的记录时,我需要插入Id:1的新行,如果没有更新现有记录。

DAO.getInstance().saveOrUpdate(object, session);

使用saveOrUpdate我收到以下异常

ERROR - tractFlushingEventListener - Could not synchronize database state with session
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.floreantpos.model.MenuCategory#2]
    at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1769)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2412)
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2312)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2612)
    at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:96)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)

但如果我使用save方法插入新行,那么同样有效。

任何帮助都会非常明显。

1 个答案:

答案 0 :(得分:0)

如果内存中存在id,则会更新saveOrUpdate();如果没有id,则插入新行。

来自documentation

saveOrUpdate()执行以下操作:

如果对象在此会话中已经持久化,则不执行任何操作

如果与会话关联的另一个对象具有相同的标识符,则抛出异常

如果对象没有标识符属性,则保存()它

如果对象的标识符具有分配给新实例化对象的值,则保存()它

如果对象是由or版本化的,并且version属性值是分配给新实例化对象的相同值,则保存()它

否则更新()对象