hibernate拦截器的用途之一
来源:互联网 发布:mac怎么共享 编辑:程序博客网 时间:2024/06/07 02:47
举个实际的例子, 偶们有时候会需要做Audit: 一条记录什么时候被谁创建, 以及最近由谁在何时更新, 以前的做法是在代码里面各处分散地写上:
- entity.setCreated(new Date(););;
- entity.setCreatedBy(userId);;
- session.save(entity);;
这样重复的代码就到处都是了, 很不爽呢, OOP号称的once and only once不应该是这样的吧, 让偶们来看看Interceptor它怎么帮忙解决这个问题
先来定义一个mark性质的interface:
- public interface Auditable {
- public AuditInfo getAuditInfo();;
- public void setAuditInfo(AuditInfo auditInfo);;
- }
然后是AuditInfo, 用来记录这些信息:
- public final class AuditInfo implements Serializable {
- private Date lastUpdated;
- private Date created;
- private String updatedBy;
- private String createdBy;
- //getter, setter
- }
如果偶们的一个业务对象需要有这样能够被Audit的功能, 那么就让它实现Auditable这个接口:
- public class FooBean implements Auditable {
- private Long id;
- private String bar;
- private AuditInfo auditInfo = new AuditInfo();;
- //getter, setter
- }
然后定义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>
<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(););;
- }
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等等......
- hibernate拦截器的用途之一
- define的用途之一
- 拦截器timer的用途-显示某个action方法耗时
- Hibernate工厂模式的用途
- Hibernate的拦截器和监听器
- Hibernate的拦截器和监听器
- Hibernate的拦截器和监听器 .
- Hibernate简单的拦截器原理
- Hibernate拦截器
- Hibernate 拦截器
- Hibernate拦截器
- hibernate拦截器demo
- Hibernate 拦截器实例
- Hibernate拦截器
- Hibernate拦截器
- Hibernate拦截器
- Hibernate的jar包的用途
- Hibernate中各个JAR包的用途
- cookie和session
- 交易员学堂第六课 自我实现的价格走势
- [RabbitMQ+Python入门经典] 兔子和兔子窝
- AndroidRuntime(21900): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo
- asp.net中获取当前url的方法
- hibernate拦截器的用途之一
- Drupal当中的entity node之间的关系
- 交易员学堂第七课 如何对待交易秘籍?
- xml
- 一个奇怪的不可中断进程
- 修改exe
- spring学习
- Proactor和Reactor模式
- POJ 1580 String Matching 很纠结,代码写了很多,还是过了,再对比一下人家的代码,惭愧