Hibernate Transaction Manager不提交数据更改

时间:2018-12-04 20:36:16

标签: spring hibernate transactions h2

我正在使用Hibernate 4将数据写入到H2嵌入式内存数据库中,事务似乎存在问题。该应用程序已经使用Oracle,并且H2已添加了单独的SessionFactoryTransactionManagerTransactionManager。原始TransactionManager被标记为默认值,H2 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 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> 和相关的bean定义如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<bean id="itemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
   <property name="resource" value="file:outputFile.txt" />
   <property name="lineAggregator">
      <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
         <property name="delimiter" value=";" />
         <property name="fieldExtractor">
            <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
               <property name="names" value="partnerId, addressId, address,city,country,pin " />
            </bean>
         </property>
      </bean>
   </property>
   <property name="headerCallback" ref="headerCallback" />
</bean>

1 个答案:

答案 0 :(得分:0)

这是由于我的配置错误(当然)。我不完全了解每次针对H2打开会话时都会评估连接URL,这意味着init-h2.sql被重复执行。 init-h2.sql包含一个截断和一个插入,因此每次Hibernate打开会话时它都会删除并重新创建数据。