如何正确使用Java的Observable和Observer与JPA实体?

时间:2016-02-27 15:36:08

标签: java jpa observer-pattern

我有两个实体:

    @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中维护观察者列表并执行后加载操作以将观察者添加到Observable超类:

     @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中维护相同的对象列表,这对我来说似乎只是一个糟糕的解决方法。

无论是否使用Observer模式,我如何干净利落地实现这一目标?

1 个答案:

答案 0 :(得分:1)

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

  • 除非连接以列
  • 的形式存储在数据库中,否则JPA不会在对象之间创建连接
  • 您没有在任何地方调用notifyobservers方法,因此实际上不会进行任何更改
  • 您应该使用JPA生命周期事件,如@PrePersist和适当的处理程序而不是观察者