てきとうなメモ

本の感想とか技術メモとか

Hibernateでcreated_at/modified_at

Interceptorを使えばよいか。

public class DatetimeInterceptor extends EmptyInterceptor {
    @Override
    public boolean onFlushDirty(Object entity, Serializable id,
            Object[] currentState, Object[] previousState,
            String[] propertyNames, Type[] types) {

        for (int i = 0; i < propertyNames.length; i++) {
            if (propertyNames[i].equals("modified")) {
                currentState[i] = new Date();
                return true;
            }

        }
        return false;
    }

    @Override
    public boolean onSave(Object entity, Serializable id, Object[] state,
            String[] propertyNames, Type[] types) {
        boolean modified = false;
        for (int i = 0; i < propertyNames.length; i++) {
            if (propertyNames[i].equals("created") ||
                propertyNames[i].equals("modified")) {
                state[i] = new Date();
                modified = true;
            }
        }
        return modified;
    }
}

で、使う時に

        SessionFactory sf = new Configuration()
        .setInterceptor(new DatetimeInterceptor())
        .configure()
        .buildSessionFactory();

とすれば良いっぽい

(追記)
createdの方は初回以外は更新されないのだけども、Entityにsetすれば更新可能なのでそこは気をつけないといけない。まあ、その方がどうしても更新したい場合を考えると便利だが。