Hibernate Transaction Manager 不提交数据更改
Posted
技术标签:
【中文标题】Hibernate Transaction Manager 不提交数据更改【英文标题】:Hibernate Transaction Manager not committing data changes 【发布时间】:2018-12-04 20:36:15 【问题描述】:我正在使用 Hibernate 4 将数据写入 H2 嵌入式内存数据库,但事务似乎存在问题。该应用程序已使用 Oracle,并且 H2 添加了单独的 DataSource
、SessionFactory
和 TransactionManager
。原始TransactionManager
被标记为默认值,H2 TransactionManager
具有限定符memTransactions
以下代码 - 特别是 load
函数 - 使用写入的数据正确填充末尾的 memEvents
变量。
@Repository
@Transactional(transactionManager = "memTransactions")
public class EventMemDaoHibernate implements EventMemDao
@Autowired
@Qualifier(value = "memSessionFactory")
private SessionFactory memSessionFactory;
@Override
public List<EventMem> getEvents()
return memSessionFactory.getCurrentSession().createCriteria(EventMem.class).list();
@Override
public void load(List<Event> allEvents)
Session session = memSessionFactory.getCurrentSession();
for (Event e : allEvents)
EventMem memEvent = new EventMem(e);
session.save(memEvent);
List<EventMem> memEvents = getEvents(); // correct
但是下面的代码会产生一个空的memEvents
列表
@Autowired
private EventMemDao eventMemDao;
List<Event> allEvents = eventDao.getAllEvents();
eventMemDao.load(allEvents); // calls the load function shown above
List<EventMem> memEvents = eventMemDao.getEvents(); // empty
我认为这与事务管理有关(例如:调用 .save()
后数据不会自动提交)。但是,当我尝试在 EventMemDaoHibernate#load
中明确开始并提交事务时,我收到此错误:
不支持嵌套事务
所以,据我所知,TransactionManager
正在工作。
我的TransactionManager
和相关的bean定义如下所示。
<bean
id="memTransactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="memSessionFactory" />
<qualifier value="memTransactions"/>
</bean>
<bean id="hDataSource" class="org.h2.jdbcx.JdbcDataSource">
<property name="url" value="jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'classpath:scripts/init-h2.sql'" />
<property name="user" value="sa" />
<property name="password" value="" />
</bean>
<bean
id="memSessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="hDataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
</props>
</property>
</bean>
【问题讨论】:
【参考方案1】:这是由于我的配置错误(当然)。我没有完全理解每次针对 H2 打开会话时都会评估连接 URL,这意味着重复执行 init-h2.sql。 init-h2.sql 包含一个截断后跟一个插入,因此每次 Hibernate 打开会话时它都会删除和重新创建数据。
【讨论】:
以上是关于Hibernate Transaction Manager 不提交数据更改的主要内容,如果未能解决你的问题,请参考以下文章
无法提交 Hibernate 事务;嵌套异常是 org.hibernate.Transaction 异常:JDBC 提交失败
需要了解Hibernate配置的transaction.factory_class
hibernate.org 捆绑“导入包”链接到 rt.jar 中的错误包 javax.transaction 而不是 jboss-transaction.jar
Hibernate 4 + Spring 3.2 + Transaction:一个服务,几个道,一个方法
hibernate课程 初探单表映射2-4 transaction简介
Transaction not successfully started&&Could not commit Hibernate transaction;