Hibernate Transaction Manager не фиксирует изменения данных - PullRequest
0 голосов
/ 04 декабря 2018

Я использую 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>

1 Ответ

0 голосов
/ 06 декабря 2018

Это было связано с моей ошибкой конфигурации (конечно).Я не совсем понял, что URL-адрес соединения оценивался каждый раз, когда сеанс открывался для H2, и это означает, что init-h2.sql выполнялся неоднократно.init-h2.sql включал усечение, за которым следовала вставка, поэтому он сбрасывал и воссоздавал данные каждый раз, когда Hibernate открывал сеанс.

...