gpt4 book ai didi

java - 插入失败后恢复 Hibernate session 状态

转载 作者:搜寻专家 更新时间:2023-10-31 20:16:18 24 4
gpt4 key购买 nike

以下代码尝试使用 Spring+Hibernate 将 Item 对象插入到数据库中。 Item 有一个作为主键的 Integer id 字段,以及一个受唯一约束约束的 name 列(简化示例)。
我知道该项目的 id 为空(该项目是暂时的)但是由于名称字段的唯一约束,插入可能仍然会失败。

try {
getHibernateTemplate().save(myItem);
getHibernateTemplate().flush(); // exception thrown here if the name is not unique
}
catch (DataIntegrityViolationException e) {
Item itemFromDb = (Item) getHibernateTemplate()
.find("from Item item where item.name = ?",
myItem.getName()).get(0);
//
// copy some properties from myItem to itemFromDb
//
getHibernateTemplate.update (itemFromDb)
}

我需要这段代码在一个事务中为许多项目循环运行,这就是为什么我要在插入失败时尝试发出更新。

但是,插入失败后,hibernate session 处于一种奇怪的状态,当我发出 select 语句从 db 中获取项目时,抛出原始异常。

我尝试在插入失败后使用 session.evict(),但无济于事。有什么想法吗?

这是我在选择失败后在控制台中看到的。 Hibernate 在 select 语句上失败,但仍打印有关先前插入语句的信息。

WARN  [http-8080-1] hibernate.util.JDBCExceptionReporter (JDBCExceptionReporter.java:77) - SQL Error: 2627, SQLState: 23000
ERROR [http-8080-1] hibernate.util.JDBCExceptionReporter (JDBCExceptionReporter.java:78) - Violation of UNIQUE KEY constraint 'unq_Item_name'. Cannot insert duplicate key in object 'items'.
ERROR [http-8080-1] event.def.AbstractFlushingEventListener (AbstractFlushingEventListener.java:301) - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: could not insert: [com.sample.Item]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)

附言请不要告诉我有关 hibernate 的 saveOrUpdate 方法的信息,我知道它的作用。

最佳答案

一旦抛出数据库异常,Hibernate 不保证 session 的任何内容。你应该回滚。如果我理解 Bozho 的建议,他是说您应该先从名称列读取以确保插入不会失败。对我来说很有意义。

关于java - 插入失败后恢复 Hibernate session 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2281870/

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