2016-02-27 28 views
0

我有两个实体:如何正确使用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中,这对我来说只是一个糟糕的解决方法。

如何在使用或不使用观察者模式时干净地实现此目的?

+0

downvote的原因? –

+0

Observer/Observable的典型用法是仅*松散耦合的对象;即Observable的Observer的列表可以包含任何类型的对象,而Observable几乎不知道它们是什么。例如,UI元素(例如文本字段)可以是模型Observable(例如Employee)的Observer。 Employee中应该有* no *代码,它明确知道它的一个Observers是一个UI组件。 JPA映射适用于具有更紧密关系的对象。涉及的对象明确知道其相关对象的类型。 –

回答

1

你需要重新思考你的实际目标是什么,至少对我来说用例是完全不清楚的。

  • JPA不创建对象之间的连接,除非该连接存储在数据库中为列
  • 你是不是调用notifyobservers方法任何地方,任何更改将实际广播
  • 你或许应该使用JPA生命周期事件如@PrePersist和正确的处理程序而不是观察者
相关问题