【问题标题】:Gateway Pattern using Java EE使用 Java EE 的网关模式
【发布时间】:2014-03-13 17:29:39
【问题描述】:

我在一个 Java EE 项目中使用网关模式:

具有扩展存在上下文的有状态会话 bean。

bean 的事务属性设置为不支持,以便 停止任何要提交到数据库的事务。

bean 有一个保存方法,其中事务属性设置为 require new 这将导致一个新事务,该事务将提交所有 实体的变化并将其反映到数据库中。

查看网关:adam bein page-67

直到两天前,我还在使用 GlassFish 3 并且一切正常。我检索一个实体,进行更改,然后调用 save 方法而不合并实体。实体更改被刷新到数据库。但是当我将 GlassFish 更改为 GlassFish 4 时,此操作停止了,现在我必须合并实体才能将更改后的实体刷新到数据库中。

【问题讨论】:

标签: java jakarta-ee glassfish-3 glassfish-4


【解决方案1】:

Save 专门做一个插入。所以再次调用 save 将导致数据库中的另一行。

Update 更新会话中的对象。因此,如果对象在会话中,它将更新。 如果对象不在会话中,则应调用合并。

所以如果你检索一个已经存在的实体,你必须调用更新/合并而不是保存。

JPA specification

应用于实体 X 的合并操作的语义如下: 如果 X 是分离实体,则将 X 的状态复制到具有相同身份的预先存在的托管实体实例 X' 上,或者创建 X 的新托管副本 X'。

如果 X 是一个新的实体实例,则创建一个新的托管实体实例 X',并将 X 的状态复制到新的托管实体实例 X'。

如果 X 是已移除的实体实例,则合并操作将抛出 IllegalArgumentException(否则事务提交将失败)。

如果 X 是托管实体,则合并操作将忽略它,但是,如果这些关系已使用级联元素值 cascade=MERGE 或 cascade=ALL 进行注释,则合并操作将级联到由 X 的关系引用的实体注解。 对于由来自 X 的具有级联元素值 cascade=MERGE 或 cascade=ALL 的关系引用的所有实体 Y,Y 被递归地合并为 Y'。对于由 X 引用的所有此类 Y,X' 设置为引用 Y'。 (请注意,如果 X 是托管的,则 X 与 X' 是同一个对象。)

如果 X 是合并到 X' 的实体,并引用另一个实体 Y,其中未指定 cascade=MERGE 或 cascade=ALL,则从 X' 导航相同关联会产生对托管对象 Y 的引用' 具有与 Y 相同的持久标识。

【讨论】:

  • 我已经通过使用不同步实体管理器解决了这个问题,然后在保存方法中加入事务。我相信 glassfish 4.0.1 中有一个错误
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
相关资源
最近更新 更多