我正在使用Hibernate 4将数据写入到H2嵌入式内存数据库中,事务似乎存在问题。该应用程序已经使用Oracle,并且H2已添加了单独的SessionFactory
,TransactionManager
和TransactionManager
。原始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>
答案 0 :(得分:0)
这是由于我的配置错误(当然)。我不完全了解每次针对H2打开会话时都会评估连接URL,这意味着init-h2.sql被重复执行。 init-h2.sql包含一个截断和一个插入,因此每次Hibernate打开会话时它都会删除并重新创建数据。