Спящий режим, весна, JPS и изоляция – индивидуальная изоляция не поддерживается

Я пытался это сделать:

@Transactional(isolation=Isolation.SERIALIZABLE, rollbackFor={Exception.class}, propagation=Propagation.REQUIRES_NEW) 

по моим методам обслуживания, но весна жалуется, говоря:

 Standard JPA does not support custom isolation levels - use a special JpaDialect 

Как я могу это решить?

Эта реализация не учитывает очистку, я реализовал подобное решение, но это также объясняет необходимость очистки. Это решение можно найти здесь: http://shahzad-mughal.blogspot.com/2012/04/spring-jpa-hibernate-support-for-custom.html

JPA поддерживает нестандартные уровни изоляции. Вы можете расширить class HibernateJpaDialect и переопределить связанные с подключением методы, чтобы вы могли устанавливать собственные уровни изоляции в Connection

Вот что я написал, но еще не проверял:

 public class HibernateExtendedJpaDialect extends HibernateJpaDialect { @Override public Object beginTransaction(EntityManager entityManager, TransactionDefinition definition) throws PersistenceException, SQLException, TransactionException { Session session = (Session) entityManager.getDelegate(); DataSourceUtils.prepareConnectionForTransaction(session.connection(), definition); entityManager.getTransaction().begin(); return prepareTransaction(entityManager, definition.isReadOnly(), definition.getName()); } } 

И вы определяете это как свойство своего EntityManagerFactory :

    

Опираясь на ответ Божо и рассматривая комментарии к ним, кажется, что это полное (совместимое с Hibernate 4) решение, требующее сброса соединения. Лучше всего сказать, что весенний слой будет гарантировать вызов метода cleanupTransaction, но если это на самом деле не гарантировано, возможно, это необходимо передумать из-за возможности утечки памяти PermGen и побочных эффектов после запроса на объект соединения ,

 public class HibernateExtendedJpaDialect extends HibernateJpaDialect { ThreadLocal connectionThreadLocal = new ThreadLocal<>(); ThreadLocal originalIsolation = new ThreadLocal<>(); @Override public Object beginTransaction(EntityManager entityManager, TransactionDefinition definition) throws PersistenceException, SQLException, TransactionException { boolean readOnly = definition.isReadOnly(); Connection connection = this.getJdbcConnection(entityManager, readOnly).getConnection(); connectionThreadLocal.set(connection); originalIsolation.set(DataSourceUtils .prepareConnectionForTransaction(connection, definition)); entityManager.getTransaction().begin(); return prepareTransaction(entityManager, readOnly, definition.getName()); } /* We just have to trust that spring won't forget to call us. If they forget, we get a thread-local/classloader memory leak and messed up isolation levels. The finally blocks on line 805 and 876 of AbstractPlatformTransactionManager (Spring 3.2.3) seem to ensure this, though there is a bit of logic between there and the actual call to this method. */ @Override public void cleanupTransaction(Object transactionData) { try { super.cleanupTransaction(transactionData); DataSourceUtils.resetConnectionAfterTransaction( connectionThreadLocal.get(), originalIsolation.get()); } finally { connectionThreadLocal.remove(); originalIsolation.remove(); } } } 

@ Shahzad Mughal Я оставил вам две точки 😉 Ваш ответ должен быть принят как правильный. Принятый ответ возникнет в следующем выпуске, случайно не позволяющем ведущим разработчикам думать, что есть ошибки с драйвером mysql, например:

WARN [org.hibernate.util.JDBCExceptionReporter] – Ошибка SQL: 0, SQLState: S1009 ERROR [org.hibernate.util.JDBCExceptionReporter] – Соединение доступно только для чтения. Запросы, приводящие к изменению данных, не допускаются

Вы можете больше узнать о нашем приключении с этой проблемой на http://thinkinginsoftware.blogspot.com/2013/10/connection-is-read-only-queries-leading.html

При указании JpaTransactionManager вы указали JPADialect? По умолчанию я думаю, что он использует DefaultJpaDialect, и вам нужен HibernateJpaDialect .

Вы также можете обернуть компонент «datasource» с помощью «IsolationLevelDataSourceAdapter», просто сделав следующее:

     

где «_dataSource» является ссылкой на фактический источник данных.

  • Тип безопасности: непроверенный литой
  • Возможно ли иметь несколько PropertyPlaceHolderConfigurer в моем applicationContext?
  • Оснащение весны с помощью @Configurable
  • Использование методов PUT и DELETE в Spring MVC
  • Запустите главную роль Spring-boot с помощью IDE
  • Как включить js и CSS в JSP с помощью Spring MVC
  • В чем разница между интерфейсами CrudRepository и JpaRepository в Spring Data JPA?
  • Вызов метода Spring @Transaction методом одного и того же classа не работает?
  • Как создать пользовательский идентификатор, используя hibernate, в то время как он должен быть первичным ключом таблицы
  • Если вы настроили свойства подключения к базе данных в файле server.xml или context.xml
  • что это значит, когда говорят, что http не имеет
  • Interesting Posts

    CSS Div растягивает 100% высоты страницы

    Какой алгоритм параллельной сортировки имеет лучшую среднюю производительность?

    Установите маску макета TextView программно

    Доступ 2007 – Левый Присоединиться к запросу возвращает #Error вместо Null

    NodeJS – Ошибка при установке с помощью NPM

    Как я могу назвать фильтр Angular.js с несколькими аргументами?

    multimap в .NET.

    Является ли обратная косая черта приемлемой в директивах C и C ++ #include?

    Использование дополнительных 16 бит в 64-битных указателях

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

    UITableView – лучшее редактирование посредством привязки?

    Примеры использования RedisStore в socket.io

    Как добавить пользовательское действие WiX, которое происходит только при удалении (через MSI)?

    Как я могу гарантировать, что разделение целых чисел всегда округляется?

    Префикс значок панели задач с номером

    Давайте будем гением компьютера.