如何用Java封装事务模式
我正在尝试使用类似这样的事务模式为我的数据库模型编写DAO如何用Java封装事务模式,java,mysql,database,hibernate,transactions,Java,Mysql,Database,Hibernate,Transactions,我正在尝试使用类似这样的事务模式为我的数据库模型编写DAO Session session = null; Transaction tx = null; try{ session = HibernateUtil.getSessionFactory().openSession(); tx = session.beginTransaction(); tx.setTimeout(5); //doSomethin
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction();
tx.setTimeout(5);
//doSomething(session);
tx.commit();
}catch(RuntimeException e){
try{
tx.rollback();
}catch(RuntimeException rbe){
log.error("Couldn’t roll back transaction", rbe);
}
throw e;
}finally{
if(session!=null){
session.close();
}
}
将此模式封装到具有
//doSomething(session);
作为交易的一部分执行的参数?有时我运行一个查询,有时我操作会话.saveOrUpdate
,等等。我有很多DAO要写,这种代码重复模式让我很困扰
编辑
在会话
操作和HQL(保存或更新
,删除
,等等)之间是否存在直接映射,所以我只需要传递到这个方法中的一个查询
谢谢你的见解。像这样的东西可能就是你想要的
public void doSomething(MyQuery myQuery) {
...
Transaction tx = null;
try {
...
myQuery.execute(tx);
...
} catch (...) {
} finally {
}
}
public class MyQuery {
public void execute(Transaction tx) {
// run queries on transaction
}
}
为要执行的每个查询或查询集创建一个新的
MyQuery
实例或一个新的MyQuery
子类,感谢您的响应。仔细考虑后,可以使用会话对象执行某些操作,如session.merge()
,session.get()
,等等。这些函数与查询之间是否存在有效的映射。这样,我可以从会话依赖项中完全提取所有查询。@您可以始终将execute
签名更改为execute(会话会话,事务tx)
,并让“查询”在会话对象上执行方法。如果要将事务和会话部分分开,请使用带有execute(transaction tx)
方法的MyQuery
类和带有execute(session session)
方法的MySessionState
类谢谢!我做了一些修改,我让它工作了。希望有像C#这样的任务。