2009-09-10 3 views
0

При попытке установить блокировку (пессимистический), со следующим кодом:Как реализовать пессимистическую блокировку в JPA с помощью Glassfish 2.1?

em.lock(controlnumbers, LockModeType.WRITE); 
em.refresh(controlnumbers); 

Я получаю следующее исключение:

[#|2009-09-10T15:42:48.324-0400|INFO|sun-appserver2.1|javax.enterprise.system.container.ejb|_ThreadID=31;_ThreadName=httpSSLWorkerThread-8080-19;| 
javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: javax.persistence.PersistenceException: ejb30-wrong-lock_called_without_version_locking-index (There is no English translation for this message.) 
javax.persistence.PersistenceException: ejb30-wrong-lock_called_without_version_locking-index (There is no English translation for this message.) 
     at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.lock(EntityManagerImpl.java:619) 
     at com.sun.enterprise.util.EntityManagerWrapper.lock(EntityManagerWrapper.java:582) 
     at com.eximtechnologies.transactionserver.persistence.session.ControlNumbersFacade.lock(ControlNumbersFacade.java:43) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 

Как я могу реализовать пессимистическую блокировку с Glassfish 2.1?

ответ

2

Существует TOPLINK Основы (GF 2.1 по умолчанию) конкретный способ сделать это:

public MyObject lock (MyObject controlnumbers) { 
    String qStr = "select object(o) from MyObject as o where o.pk = :pk"; 
    Query q = em.createQuery(qStr); 
    q.setParameter("pk", "a"); 
    q.setHint("toplink.pessimistic-lock", "Lock"); 
    controlnumbers = (MyObject)q.getSingleResult(); 
    return controlnumbers; 
} 

Я верю, что с Hibernate вызов em.lock на самом деле будет работать.

0

Можете ли вы показать сопоставление для своего класса? Похоже, вы упускаете свойство версии ... Взгляните на

http://en.wikibooks.org/wiki/Java_Persistence/Locking#Timestamp_Locking

С уважением, Ян

+0

Это сработало бы, если бы я хотел оптимистичную блокировку. Как говорится в этом вопросе, мне нужна пессимистическая блокировка. :) – jsight

+0

В соответствии с EJB3-спецификацией lock() поддерживается только для объектов с атрибутом @version. – Jan

+0

@Jan - Это хорошо, но не отвечает на вопрос. :) Большинство контейнеров имеют возможность поддерживать пессимистическую блокировку (в определенном контейнере). Glassfish делает также, с помощью подсказок подсказок ... :) – jsight