У меня есть следующие настройки.
- Spring 3.0.5
- Hibernate 3.5.6
- MySql 5.1
Toсохранить запись в БД через Hibernate У меня есть следующий рабочий процесс
отправить JSON {id:1,name:"test",children:[...]}
в Spring MVC App и использовать Джексона для преобразования его в граф объектов (если это существующийэкземпляр JSON имеет правильный идентификатор записи в наборе БД
сохранить объект в БД с помощью вызова уровня обслуживания (подробности ниже)
функция сохранения интерфейса уровня обслуживания SomeObjectService
имеет аннотацию @Transactional с readOnly=false
и распространением REQUIRED
реализация этого уровня обслуживания SomeObjectServieImpl
вызываетМетод сохранения DAO
DAO сохраняет новые данные с помощью вызова слияния hibernate, например, hibernateTempate().merge(someObj)
hibernate merge
загружает объектсначала из БД через SELECT
У меня есть EntityListener, который подключен к пружине (я использовалэтот метод Spring + EntityManagerFactory + Hibernate Listeners + Injection ) и слушает @PostLoad
Слушатель использует LockingServie
для обновления одного поля someObject
установить его как заблокированный (это на самом деле должно происходить только тогда, когда someObject
загружается через вызовы Hibernate HQL, SQL или Criteria , но вызывается также при объединении)
LockingServie
имеет функцию lock(someObj,userId)
, которая также аннотируется @Transactional с readOnly=false
и REQUIRED
обновление происходит через вызов Query query = sess.createQuery("update someObj set lockedBy=:userId");
и затем query.executeUpdate();
после того, как слияние загрузило данные, оно начинается с обновления someObject
и вставки соответствующих дочерних элементов (<= здесь, в этом случае, возникает тупик <strong>)
вернуть результат JSON (включая недавно созданный идентификатор объекта) обратно клиенту.
Кажется, проблемадля меня первая
- запись загружается в транзакцию
- затем изменяется в другой (внутренней) транзакции
- и затем должен снова обновляться данными внешней транзакции, но не может обновляться, потому что она заблокирована.
Через MySQL
SHOW OPEN TABLES
я вижу, что дочерняя таблица (которая является частью графа объектов) заблокирована.
Интересно, что тупик не возникает натаблица someObj , а точнее таблица, представляющая дочерний элемент.
Я немного растерялся здесь.Любая помощь более чем приветствуется.
Кстати, может, уровень изоляции может вытащить меня из этой проблемы здесь?