我们知道,在Hibernate中除开查询数据之外.对数据库进行,添加,修改,删除数据的时,需要对事务的手动提交.
在session对数据保存数据时,都需要手动开启事务,这样的操作非常的繁琐.
所以,我们决定使用Proxy类.去帮助我们处理,这样的操作.
Transaxtion tx = session.beginTransaction();
session.save(obj);
tx.commit();
Proxy类,具体的实现如下:
package pack.hibernate.basedao;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pack.hibernate.sessionfactory.HibernateSessionFactory;
/**
* 动态代理类;
* 必须实现InvocationHandler
* @author zhouhaitao
*
*/
public class MyProxy implements InvocationHandler{
//根据构造方法给业务对象初始化;
//代理业务对象
private Object service;
public MyProxy(Object service){
this.service = service;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Session session = HibernateSessionFactory.getSession();
Transaction tr = session.beginTransaction();
Object obj = null;
try {
//会自动调用反射方法(调用原来的业务方法)
obj = method.invoke(service, args);
tr.commit();
} catch (Throwable e) {
tr.rollback();
e.printStackTrace();
}
return obj;
}
}
之后,通过代理工厂负责,创建创建每一个的事务代理的实例.具体代码如下:
package pack.hibernate.basedao;
import java.lang.reflect.Proxy;
/**
* 根据代理类生成业务代理对象;
* @author zhouhaitao
*/
public class MyServiceFactory {
public static Object getObject(Object service){
//1.service加载器
//2.service实现的接口
//3.代理对象
return Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(),new MyProxy(service));
}
}
//然后,我们再Struts Action中. 根据UserLoginServiceImpl业务实现类,通过
MyServiceFactory工厂。获得LoginService接口. 则使用这个接口对象.进行操作即可。
ILoginService uis=(ILoginService)MyServiceFactory.getObject(new UserLoginServiceImpl());