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

时间:2012-12-17 13:50:01

标签: java jpa equals cdi session-scope

在我的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 entites,并且不是相同的参考。但我想将更改分发给EntityB的所有分离实例。我在我的应用程序中有这种情况数百次,所以我不想照顾,哪些对象必须在哪些情况下更新。我需要一些解决方法,它会自动为我做。一个想法是将我在此会话中使用的所有对象保留在特殊列表中,并且每次提交和处理请求时都会迭代此映射并更改等于对象。但他的声音很脏。也许在JPA函数中有一个构建来使所有相等的对象成为相同的引用。我不知道这是否可行。你有解决方案吗?感谢。

2 个答案:

答案 0 :(得分: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字段。

答案 1 :(得分:0)

这是经典的表单处理逻辑

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