拦截器与事件都是hibernate的扩展机制
Interceptor接口是老的实现机制
现在改成事件监听机制; 他们都是hibernate的回调接口,hibernate在save,delete,update…等会回调这些类。
事件设置
一、 根据要监听的事件,继承相应的接口,如SaveOrUpdateEventListener,DeleteEventListener。
SaveListener.java
package com.dwt1220; import org.hibernate.HibernateException; import org.hibernate.event.SaveOrUpdateEvent; import org.hibernate.event.SaveOrUpdateEventListener; public class SaveListener implements SaveOrUpdateEventListener { private static final long serialVersionUID = 7850872147039358837L; public void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException { if(event.getObject() instanceof com.dwt1220.User){ User user=(User) event.getObject(); System.out.println("--------"+user.getName().getFirstName()); } } }
二、hibernate.cfg.xml 中在配置Listener
在hibernate.cfg.xml中添加
<event type="save"> <listener class="com.dwt1220.SaveListener" /> <listener class="org.hibernate.event.def.DefaultSaveEventListener"/> </event>
※listener配置的顺序,就是执行的顺序
※当自己配置了listener时,会把默认的覆盖掉。所以,配置时,要加上默认的Listener
public List sql() { Session session = HibernateUtil.getSession(); /***** * 返回的是 List<Object> Query * query=session.createSQLQuery("select * from user") * 要在之后添加.addEntity(User.class); *********************/ Query query = session.createSQLQuery("select * from user").addEntity( User.class); List<User> users = query.list(); for (User user : users) { System.out.println(user.getName()); } return users; }
<query> 中填写的是 HQL <sql-query> 中填写的是SQL
这两个标签可以写在 <class>里面,也可以写在外面,如果写在<class>里面的话,Query query=session.getNamedQuery("getUserByBirthday");时就需要把包名,类名和别名都写上。
<query name="getUserByBirthday"> <![CDATA[from User where birthday=:birthday]]> </query>
类中使用。
public List namedQuery(Date date) { Session session = HibernateUtil.getSession(); //如果<query>标签写在<class>标签中的话,参数要全名 //Query query=session.getNamedQuery("com.dwt1220.User.getUserByBirthday"); Query query=session.getNamedQuery("getUserByBirthday"); query.setDate("birthday", date); return query.list(); }