2013-02-26 45 views
1

當我嘗試更新託管實體EJB時,我收到OptimisticLockExceptionJBossAS-7中的OptimisticLockException

的EJB經取:

port = entityManager.find(PortEntity.class, portID); 

然後EJB和EntityManager的已被傳遞到SAX ContentHandler使得在endDocuent()方法可以更新。 ContentHandler已從Google的Time Zone API server(s)返回的數據中提取時區信息。

的代碼片段是:

entityManager.refresh(port); 
if (entityManager.contains(port)) 
    log.info("Contained: " + port); 
else 
    log.info("NOT Contained: " + port); 

port.setTimezone(toTimezone); 
entityManager.flush(); // <-- Line 70 

和日誌文件顯示:

13:48:05,568 INFO [GeotimezoneHandler] Status: OK 
13:48:05,569 INFO [GeotimezoneHandler] Raw offset: 3600.0000000 
13:48:05,570 INFO [GeotimezoneHandler] DST offset: 0.0000000 
13:48:05,570 INFO [GeotimezoneHandler] Timezone ID: Europe/Madrid 
13:48:05,571 INFO [GeotimezoneHandler] Timezone Name: Central European Standard Time 
13:48:05,577 INFO [GeotimezoneHandler] Contained: SeaPort[id=ESBCN, name=Barcelona] 
13:48:05,591 ERROR [GeotimezoneHandler] Updating curise: javax.persistence.OptimisticLockException: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.nutrastat.voyager.entity.PortEntity$Sea#ESBCN] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.wrapStaleStateException(AbstractEntityManagerImpl.java:1390) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1308) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1289) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1295) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:976) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final] 
    at org.jboss.as.jpa.container.AbstractEntityManager.flush(AbstractEntityManager.java:439) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final] 
    at com.nutrastat.voyager.util.GeotimezoneHandler.endDocument(GeotimezoneHandler.java:70) [voyager-lib.jar:] 

因此,如果entityManager包含EJB爲什麼對矯正它做後,我得到的異常?

一如往常許多感謝您的幫助

史蒂夫

附:

我已經看過this thread和MySQL數據庫使用的是InnoDB,但我不知道如何從我的代碼中執行SELECT @@tx_isolation;命令。

回答

0

經過兩天的研究,我終於找到了問題所在。

實體類繼承自其超類a javax.persistence.Version字段。我還向表格中注入了數據,並且由於版本字段被定義爲允許空值沒有被插入一個值,但需要一個值。

相關問題