Я использую 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
работает.
My 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>