Ebeanで登録・更新・削除に共通の事後処理を追加

実現するには、BeanPersistControllerとBeanPersistListenerのどちらかを実装します。
前者はcommit前、後者はcommit後に実行されます。用途にあわせて使い分けましょう。例えば、変更の履歴を記録するのであれば、後者の方が向いているでしょう。

>BeanPersistListener only sees successfully committed events. BeanPersistController pre and post methods occur before the commit or a rollback and will see events that are later rolled back

注意するのは、Ebeanのentityを扱うpackage以下につくることです。`ebean.default=models.*,server.*`

### BeanPersistController

http://ebean-orm.github.io/apidocs/com/avaje/ebean/event/BeanPersistController.html

一部だけ定義したい場合は、BeanPersistAdapterが実装済みなので、それを継承したクラスで必要なものだけでoverrideするのもよいでしょう。

```lang:MyBeanPersistController.java

package server;

public class MyBeanPersistController implements BeanPersistController {

    /**
     * PersistControllerの優先順位を返却.
     */
    @Override
    public int getExecutionOrder() {
        return 0;
    }

    /**
     * 適用したいBeanのクラスかどうかの判定.
     */
    @Override
    public boolean isRegisterFor(Class<?> clazz) {
        return clazz.equals(Hoge.class) || clazz.equals(Foo.class) || clazz.equals(Bar.class);
    }

    /**
     * deleteメソッド後の処理.
     */
    @Override
    public void postDelete(BeanPersistRequest<?> request) {
           Object bean = request.getBean(); //Beanの取り出し
           Logger.info(bean);        
    }

    /**
     * saveメソッド後の処理.
     */
    @Override
    public void postInsert(BeanPersistRequest<?> request) {
     
    }

　　/**
     * refreshメソッド後の処理.
     */
    @Override
    public void postLoad(Object arg0, Set<String> arg1) {
       
    }

　　/**
     * updateメソッド後の処理.
     */
    @Override
    public void postUpdate(BeanPersistRequest<?> request) {
        
    }

　　/**
     * delete前の処理. 標準のままで良いならtrueを返す.
     */　
    @Override
    public boolean preDelete(BeanPersistRequest<?> arg0) {
        return true;
    }

    @Override
    public boolean preInsert(BeanPersistRequest<?> arg0) {
        return true;
    }

    @Override
    public boolean preUpdate(BeanPersistRequest<?> arg0) {
        return true;
    }
```

### BeanPersistListener

http://ebean-orm.github.io/apidocs/com/avaje/ebean/event/BeanPersistListener.html

>These listen events occur after a successful commit. They also occur in a background thread rather than the thread used to perform the actual insert update or delete. In this way there is a delay between the commit and when the listener is notified of the event.

平たくというと、Listenerに書かれた処理は別スレッドをたてて行われるとのこと。insert,update,deleteがcommitされたから、listenerの処理がはじまるまでには間が空くようです。


>For a cluster these events may need to be broadcast. Each of the inserted(), updated() and deleted() methods return true if you want those events to be broadcast to the other members of a cluster (the id values are broadcast). If these methods return false then the events are not broadcast.

更に言うと、他のEbeanServerに、insertなどのeventが起きたことを通知するために作られたもののようです。その場合は、inserted()などはtrueを返すようにしろとのことです。共通の事後処理で使うなら、falseを返せばよさそうです。とえいえ、やや強引な使いかたかもしれません。


```lang:MyPersistListener.java
public class MyPersistListener implements BeanPersistListener<Hoge> {

    @Override
    public boolean deleted(Hoge bean) {
        Logger.info(bean);
        return false;
    }

    @Override
    public boolean inserted(Host bean) {
　　　　Logger.info(bean);　
        return false;
    }

　　@Override
    public boolean updated(Hoge bean, Set<String> arg1) {
      　Logger.info(bean);
        return false;
    }　

    @Override
    public void remoteDelete(Object arg0) {
       
    }

    @Override
    public void remoteInsert(Object arg0) {
       
    }

    @Override
    public void remoteUpdate(Object arg0) {
       
    }

    
```