Я в процессе обновления приложения к Hibernate 4.2 из 3.3. Мы также используем Spring 3.1.3 (который мы не можем/не будем обновлять в это время).Некоторые транзакции, не работающие с Spring/Hibernate 4
Некоторые из моих модульных тестов теперь неудачу с
org.hibernate.HibernateException: No Session found for current thread
в SpringSessionContext. Это не проблема, поскольку <tx:annotation-driven />
определяется в неправильном контексте или случае отсутствия библиотек CGLIB. Большинство тестов действительно работают, а это значит, что в большинстве случаев работает проксирование транзакций.
Случаи, когда он сейчас не работает, похоже, связаны с использованием типов NOT_SUPPORTED, NEVER и SUPPORTED. По какой-то причине SpringSessionContext не создает сеанс в этих случаях.
В наших случаях использования иногда требуется, чтобы границы транзакций строго не совпадали с границами методов, и что сеансы иногда оживляют транзакции. В случае Spring 3/Hibernate 3 контекст сеанса привязывался к потоку локально, и вызов SessionFactory.getCurrentSession()
возвращал экземпляр сеанса, даже если транзакция не была запущена. Это поведение, которое, как мне кажется, все еще имеет место в случае Hibernate 4.
Кто-нибудь знает обходное решение для этого? Трудно выровнять границы сеанса с беседой вместо транзакции, если Spring отказывается создавать сеанс без действительной транзакции. Сессия и ее контекст сохранения не должны быть привязаны к открытой транзакции.
Указанные типы распространения никогда не вызовут создания транзакции или поиска сеанса. Сессия связана с транзакционной границей. Было какое-то обсуждение, если это правильно или нет, и в этой области есть работа, но только для новых версий Spring. –
Почему не требуется работа по распространению? что сделало бы транзакцию, если она не существует, или использовать существующую, что и похоже на то, что вам кажется. –
Propagation.REQUIRED не подходит во всех случаях. Например, у нас есть метод, который выполняет несколько транзакций. Мы установили границу транзакции в методе NEVER или NOT_SUPPORTED, чтобы гарантировать, что транзакция не будет запущена при вызове этого метода. Затем метод использует диспетчер транзакций платформы для начала/фиксации транзакций. Однако даже в этом случае sessionFactory.getCurrentSession() возвращает null и форсирует исключение. Это похоже на довольно серьезную проблему, так как HibernateTransactionManager вводится с той же фабрикой сеансов. – Jeff