如何正确使用Java的Observable和Observer与JPA实体?
问题描述:
我有两个实体:如何正确使用Java的Observable和Observer与JPA实体?
@Entity
public class A extends Observable {
@Id
private int id;
}
@Entity
public class B implements Observer {
@Id
private int id;
@ManyToMany
private List<A> observableList;
public void addObservable(A observable){
observableList.add(observable);
observable.addObserver(this); //How will this get persisted
// as it gets added in the super
//class Observable which is not an entity?
}
@Override
public void update(Observable o, Object arg){
//update methods
}
}
我的目标是通知B,每当任何可观的变化。因此我在看JDK的Observer/Observable。
我面临的问题是如何添加任何观察员得到坚持?
这是我能想到的可能方式:保持观察员的名单也是在子类A和做后负荷运转观察员添加到可观察到超:
@Entity
public class A extends Observable {
@Id
private int id;
@OneToMany
private List<B> observers;
@PostLoad
public void initialize(){
for(B b : observers){
addObserver(b);
}
}
}
这样一来,我保持相同的列表在super和subclass中,这对我来说只是一个糟糕的解决方法。
如何在使用或不使用观察者模式时干净地实现此目的?
答
你需要重新思考你的实际目标是什么,至少对我来说用例是完全不清楚的。
- JPA不创建对象之间的连接,除非该连接存储在数据库中为列
- 你是不是调用notifyobservers方法任何地方,任何更改将实际广播
- 你或许应该使用JPA生命周期事件如@PrePersist和正确的处理程序而不是观察者
downvote的原因? –
Observer/Observable的典型用法是仅*松散耦合的对象;即Observable的Observer的列表可以包含任何类型的对象,而Observable几乎不知道它们是什么。例如,UI元素(例如文本字段)可以是模型Observable(例如Employee)的Observer。 Employee中应该有* no *代码,它明确知道它的一个Observers是一个UI组件。 JPA映射适用于具有更紧密关系的对象。涉及的对象明确知道其相关对象的类型。 –