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 添加了单独的 DataSourceSessionFactoryTransactionManager。原始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;