Java:用于更新不共享相同引用的所有相等对象(在同一上下文中)的模式



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

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

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

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

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

例如,如果您有:

class MyClass {
String info;
int id;
}

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

class myClass {
myInfoClass info;
int id
}
class myInfoClass {
String value;
}

并且将相等的CCD_ 1的所有实例给予CCD_。更改myClass.info.value将有效地更改myClass的所有实例,因为它们都持有相同的myInfoClass实例。

很抱歉,如果我的语法有点错误,我经常在语言之间跳来跳去。

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

这是典型的表单处理逻辑

  • 如果用户单击保存按钮,则操作数据库中的数据
  • 每次创建网页时都重新加载数据
  • 您不应该在web会话中缓存数据
  • 如果需要缓存,请在持久层中激活它(例如hibernate缓存)

最新更新