http://blog.youkuaiyun.com/guosydragon/archive/2007/04/15/1565742.aspx
最近学到这里,有点收获,自己试出来,拿出来献丑,不过对于初学者还是有帮助的,毕竟下中文档在很多地方要钱的,呵呵。。。
下面介绍我学到的:
在我们面对的项目中有很多的操作是重复的,但又是要即时要做的,比如你要发一个贴子,就要设置时间,可能还要计算很多的值,写在业务编码里可能显得冗长,(或许还有更为严重的需要)这时,Listener就发挥它的作用了!
下面从一个实例入手:
准备工作:
1.有一个hibernate小项目;
2。写一个类,原代码如下:
package com.Hibernate.interceptor;
import java.util.Date;
import org.hibernate.event.PostInsertEvent;
import org.hibernate.event.def.DefaultPostInsertEventListener;
import com.bbs.Board;
public class MyPostSaveListener extends DefaultPostInsertEventListener {
public void onPostInsert(PostInsertEvent event) {
Object entity = event.getEntity();
if(entity instanceof Board){
Board b = (Board)entity;
b.setDate(new Date());
}
}
}
3。再在配置文件(Hiberante.hbm.xml)里加入这么一段话:
<listener class="com.Hibernate.interceptor.MyPostSaveListener" type="post-insert"></listener>
这里的type属性有那些你可以在编辑器里按Alt+/就有提示,那些类就去打相应的包咯,作用?它们的类名已经讲得很清楚了,不知道试一下就知道了嘛,呵呵。。。
现在你试一下就知道他的作用了!
自己学到得一点东东,通俗的东东,希望能给你带来方便!
我在前面说到Hibernate的event/eventlistener的作用,没有了解它的据体实现机制。
我在应用中遇到这个问题,就是在一个实体Bean中,要插入的记录的某些字段不能为空,但我想在Listener中对那些不能为空的字段加入对应的值 ,比如时间信息什么的,但显示不能插入,好像那个Listener没有起作用。
于是,我把那些不能为空的值全部设置好,再在Listener里把那些信息进行了更改,最后,我发现在产生了两条记录,一条是插入语句,一条是update语句,这搞得我莫名其妙,为什么会产生两条HQL呢?
最后我在数据库中得到了结果,那就是----那条update是Listener产生的!
也就是说,Listener并没有在Session插入数据之前对实体对象的值进行了更改,而是在记示插入之后再对Listener里重设的属性进行update更改。这样似乎增加了开销,但我对它的性能进行了简单的测试,发现并没有增加太多的开销,可能我的测试没有进行大数据的操作,或没有大数量的操作!
我也想在插入之前对实体对象的属性值进行更改,但我试了很多的类都无发达到效果,如果有谁已经可以把那产生两条语句的操作整成一条语句一次性插入操作,请不吝赐教!谢谢了!
如何使用hibernate的event/eventlistener
最新推荐文章于 2025-05-27 15:38:33 发布