2013-10-09 1 views
1

В проекте с базой данных OpenJPA 2.1 и oracle я использую режим смешанной блокировки, который по умолчанию имеет оптимистичную блокировку, но также может использовать пессимистичный. Но это не работает для меня, как я ожидал. Итак, я написал небольшой тест для блокировки openjpa.Блокировка Openjpa не работает

Persistance.xml конфигурации:

<properties> 

    <property name="openjpa.Optimistic" value="false" /> 
    <property name="openjpa.LockManager" value="mixed" /> 
<!-- <property name="openjpa.LockManager"value="mixed(VersionCheckOnReadLock=true,VersionUpdateOnWriteLock=true)" /> --> 
    <property name="openjpa.RuntimeUnenhancedClasses" value="unsupported" /> 
    <property name="openjpa.slice.ConnectionDriverName" value="oracle.jdbc.OracleDriver" /> 
    <property name="openjpa.slice.ConnectionURL" value="jdbc:oracle:thin:******" /> 
    <property name="openjpa.slice.ConnectionUserName" value="user" /> 
    <property name="openjpa.slice.ConnectionPassword" value="userpassword" /> 
    <property name="openjpa.jdbc.SynchronizeMappings" value="validate" /> 
    <property name="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)" /> 
    <property name="openjpa.Log" 
     value="DefaultLevel=INFO, Runtime=INFO, Tool=INFO, SQL=TRACE" /> 
</properties> 

Мой простой тестовый код:

Configuration config = entityManager.find(Configuration.class, 10025984L); 
entityManager.lock(config, LockModeType.PESSIMISTIC_WRITE); 

В SQL следа видим, что после вызова метода блокировки OpenJPA не выполняет каких-либо дополнительных запросов к базе данных. Single sql query:

TRACE [Thread-7] openjpa.jdbc.SQL - <t 874198043, conn 1773300146> executing prepstmnt 1809148885 SELECT t0.VERSION FROM Configuration t0 WHERE t0.ID = ? [params=?] 

Что я делаю неправильно и как я могу получить блокировку для одного экземпляра объекта?

ответ

2

Я нашел души. Причина была в настройках JPA. Я просто удаляю имущество:

<property name="openjpa.Optimistic" value="false" /> 

И все стало хорошо работать.