【发布时间】: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>
【问题讨论】:
标签: spring hibernate transactions h2