动态代理类:
package com.bj169.invoke;
import com.bj169.dao.UserDao;
import com.bj169.util.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 创建代理对象:事务增强操作了
*
* @author liulei on 2018/12/13
*/
//动态代理操作
public class TransactionHandler implements InvocationHandler {
private UserDao userDao;
public TransactionHandler(UserDao userDao) {
this.userDao = userDao;
}
public TransactionHandler() {
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Object invoke = null;
try {
invoke = method.invoke(userDao, args);
transaction.commit();
} catch (IllegalAccessException e) {
transaction.rollback();
} catch (InvocationTargetException e) {
//transaction.rollback();
System.out.println(e.getMessage());
}finally {
session.close();
}
return invoke;
}
//通过目标对象获取代理对象
// public static Object createhandler(Object target){
// return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new TransactionHandler(target));
// }
}
在serviceImpl里面获取代理对象
UserDao u=(UserDao) Proxy.newProxyInstance(UserDaoImpl.class.getClassLoader(),UserDaoImpl.class.getInterfaces(),new TransactionHandler(userDao));
u.findAll();
在dao层一定要注意写法:因为有的同事会通过事务来写,然后就会关闭session,然后这个是事务的动态增强
所以,只需要如下写就可以了