如何用Java封装事务模式

如何用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

我正在尝试使用类似这样的事务模式为我的数据库模型编写DAO

    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#这样的任务。