2014-03-13 81 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 –