在我的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函数中有一个构建来使所有相等的对象成为相同的引用。我不知道这是否可行。你有解决方案吗?感谢。
答案 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)
这是经典的表单处理逻辑