读书人

hibernate拦截器的用处之一

发布时间: 2012-09-21 15:47:26 作者: rapoo

hibernate拦截器的用途之一


举个实际的例子, 偶们有时候会需要做Audit: 一条记录什么时候被谁创建, 以及最近由谁在何时更新, 以前的做法是在代码里面各处分散地写上:


这样重复的代码就到处都是了, 很不爽呢, OOP号称的once and only once不应该是这样的吧, 让偶们来看看Interceptor它怎么帮忙解决这个问题

先来定义一个mark性质的interface:


然后是AuditInfo, 用来记录这些信息:


然后定义mapping文件:
<class name="FooBean"> <id name="id"> <generator class="native"/> </id> <property name="bar"/> <property name="auditInfo" type="readonly.persistence.hibernate.type.AuditInfoType"> <column name="LAST_UPDATED"/> <column name="CREATED"/> <column name="UPDATED_BY"/> <column name="CREATED_BY"/> </property> </class>

然后告诉Hibernate, 在打开session的时候用一个自定义的Interceptor :

public void testCreated(); { Session session = sf.openSession (new MockAuditInterceptor(););; FooBean foo = new FooBean();; foo.setBar("abc");; session.save(foo);; session.flush();; session.close();; assertNotNull(foo.getAuditInfo();.getCreated(););; assertEquals("mock", foo.getAuditInfo();.getCreatedBy(););; }

That's all, 比原来简单多了, 以后如果你有新的Entity需要这个特性的话, implements Auditable一下, 就OK了, 这样就达到了代码重用的目的了.

Interceptor的用处有很多, 就看偶们怎么从一堆代码中, 总结一些可以公用的特性了, 以此类推, 还能做EntityCRUDPermissionInterceptor, HistoryInterceptor, SearchIndexInterceptor等等......

读书人网 >移动开发

热点推荐