3

在我的 java 应用程序中,我在不同的地方多次使用相同的对象。这意味着当比较这些对象时,equals 方法返回 true。现在我想更新一个对象并对所有相等的对象进行更改。你知道是否有这样的模式吗?

我的具体用例是:我正在使用 JSF、JPA 和 CDI。用户在允许他编辑分离实体 EntityA 的网页上。该页面是会话范围的。EntityA 有两个对 EntityB 的引用(也是分离的)。这些对象可以相同。不是同一个引用,但它们可能是相等的。

@Entity
public class EntityA {
   @OneToOne()
   private EntityB entity1;
   @OneToOne();
   private EntityB entity2;
}

JSF 视图允许用户从选择列表中选择 entity1 和 entity2。它还显示了这些 EntityB 的一些详细信息,并且允许用户单独编辑 entity1 和 entity2。一切正常,除了用户为 entity1 和 entity2 选择了相同(相等)的 EntityB。然后,仅更新对这些对象的引用。当然 entity1 和 entity2 是两个不同的 JPA 实体,并且不是同一个引用。但我想将更改分发到 EntityB 的所有分离实例。我的应用程序中有数百次这种情况,所以我不想关心,在哪些情况下必须更新哪些对象。我需要一些自动为我做的解决方案。一个想法是将我在此会话中使用的所有对象保留在特殊列表中,并且每次提交和处理请求时都会遍历此映射并更改所有相等的对象。但是他的声音很脏。也许有一个内置的 JPA 函数可以使所有相等的对象具有相同的引用。我不知道这是否可能。您对此有解决方案吗?谢谢。

4

2 回答 2

1

我将在这里稍微抽象一下您的问题:如果对一个对象的更改需要更改许多其他对象,请考虑将您正在更改的字段放在一个单独的对象中,并让所有这些对象引用它。

例如,如果您有:

class MyClass {
  String info;
  int id;
}

当 'info' 字段更改时,两个具有相同 'id' 的 MyClass 实例都应该更新,然后使用:

class myClass {
  myInfoClass info;
  int id
}

class myInfoClass {
  String value;
}

并给出 的所有实例myClass都等于 的相同实例myInfoClass。更改myClass.info.value将有效地更改 的所有实例myClass,因为它们都拥有相同的 实例myInfoClass

抱歉,如果我的语法稍有错误,我会经常在语言之间跳转。

我在最近编写的一个游戏中使用了这种技术,其中一个开关激活了一扇门——开关和门都有一个Circuit包含布尔powered字段的对象。门的“isOpen()”方法简单地返回circuit.powered,当开关被激活时,我只是调用switch.circuit.powered = true,门自动被认为是“打开的”。以前,我让它在游戏的地图上搜索具有相同电路 ID 的所有门,并更改powered每个门上的字段。

于 2012-12-17T14:00:28.620 回答
0

这是经典的表单处理逻辑

  • 如果用户点击保存按钮操作数据库中的数据
  • 每次创建网页时重新加载数据
  • 你不应该在网络会话中缓存数据
  • 如果您需要缓存,请在持久层中激活它(例如休眠缓存)
于 2012-12-17T14:00:20.993 回答