2014-03-13 51 views
4

我使用在,我有一個Java EE項目網關模式網關模式:使用Java EE

有狀態會話Bean與擴展presistence上下文。

該bean已將事務屬性設置爲不支持,以便 停止將任何事務提交到數據庫中。

該bean有一個保存方法,事務屬性設置爲需要 new,這將導致一個新的事務,該事務將提交實體的所有 更改並將它們反映到數據庫。

看到網關:adam bein page-67

直到前兩天我使用的是GlassFish 3和所有工作正常。我檢索實體,進行更改,然後在不合並實體的情況下調用save方法。實體更改將刷新到數據庫。但是,當我將GlassFish更改爲GlassFish 4時,此操作停止,現在我必須合併實體才能將更改的實體刷新到數據庫。

+0

[gateway pattern和glassfish4](http:// stackoverflow。com/questions/22349469/gateway-pattern-and-glassfish4) –

回答

1

具體保存一個插入。所以再次調用save會導致db中的另一行。

更新更新會話中的對象。所以如果對象在會話中會更新。 如果對象不在會話中,則應調用合併。

因此,如果您檢索一個已經存在的實體,您必須調用更新/合併而不是保存。

JPA specification

應用到實體X合併操作的語義如下: 如果X是一個分離的實體,X的狀態被複制到預先存在的管理實體實例X」創建相同標識或X的新託管副本X'。

如果X是新的實體實例,則創建新的託管實體實例X',並將X的狀態複製到新的託管實體實例X'中。

如果X是已刪除的實體實例,合併操作將拋出IllegalArgumentException異常(否則事務提交將失敗)。

如果X是一個託管實體,合併操作將忽略它,但是,合併操作級聯到由X關係引用的實體(如果這些關係已使用級聯元素值進行註釋)cascade = MERGE或cascade =所有註釋。 對於具有級聯元素值級聯= MERGE或級聯= ALL的來自X的關係引用的所有實體Y,Y被遞歸地合併爲Y'。對於由X引用的所有這樣的Y,將X'設置爲引用Y'。 (請注意,如果管理X,則X與X'的對象相同)

如果X是合併到X'的實體,並引用另一個實體Y,其中cascade = MERGE或cascade = ALL不是指定,則從X'導航相同的關聯會生成對具有與Y相同持久性標識的被管理對象Y'的引用。

+1

我已經通過使用異步實體管理器然後在保存方法中加入事務來解決了這個問題。我相信在glassfish 4.0.1中有一個bug –