2009-09-10 45 views
0

當試圖建立一個鎖(悲觀),用下面的代碼:如何在Glassfish 2.1中實現對JPA的悲觀鎖定?

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 2009-09-11 15:54:01

+0

根據EJB3規範,lock()僅支持具有@version屬性的實體。 – Jan 2009-09-11 19:31:48

+0

@Jan - 很好,但沒有回答這個問題。 :)大多數容器都有能力支持悲觀鎖定(以某種特定容器的方式)。 Glassfish也是如此,通過查詢提示...... :) – jsight 2009-09-13 17:50:00