приостановить сеанс гибернации, управляемый менеджером транзакций Spring

Есть ли способ удалить/приостановить текущий сеанс гибернации, управляемый пружиной, из потока, чтобы можно было использовать новый, а затем поместить исходный сеанс обратно в поток? Оба работают с одним и тем же источником данных.

Чтобы подробнее описать проблему. Я пытаюсь создать плагин для инструмента, у которого есть собственное управление транзакциями Spring Hibernate. В этом плагине я хотел бы сделать некоторые из моих собственных баз данных, которые выполняются в нашем собственном менеджере транзакций Spring. Когда я сейчас пытаюсь выполнить действия с базой данных, наш менеджер транзакций начинает жаловаться на уже используемый несовместимый менеджер транзакций.

org.springframework.transaction.IllegalTransactionStateException: Pre-bound JDBC Connection found! HibernateTransactionManager does not support running within DataSourceTransactionManager if told to manage the DataSource itself. It is recommended to use a single HibernateTransactionManager for all transactions on a single DataSource, no matter whether Hibernate or JDBC access.

Обходной путь, который, кажется, помогает, запускает мой собственный код в другом потоке и ждет его завершения, прежде чем я продолжу работу с остальной частью кода.

Есть ли лучший способ, который кажется немного глупым/излишним? Какой-то способ приостановить текущий сеанс гибернации, затем открыть новый и восстановить исходный сеанс.


person user1344117    schedule 12.07.2012    source источник


Ответы (1)


Есть ли какая-то причина, по которой вы не можете внедрить текущий менеджер транзакций в код вашего плагина? Два tx-менеджера звучит как слишком много поваров на кухне. Если вы его внедрили, вы сможете потребовать новый сеанс, прежде чем выполнять свою работу, используя @transactional аннотации атрибут распространения REQUIRES_NEW см. документацию для примера настройки

e.g.

@transactional(propogation = Propogation.REQUIRES_NEW)
public void addXXX(Some class) {
    ...
}

Но для этого будет использоваться весенний PlatformTransactionManager< /a> вместо того, чтобы оставлять его в спящем режиме для управления сеансом/транзакцией.

person willscripted    schedule 12.07.2012