【问题标题】:How to Encapsulate Transaction Pattern in Java如何在 Java 中封装事务模式
【发布时间】:2013-06-08 23:18:35
【问题描述】:

我正在尝试使用这样的事务模式为我的数据库模型编写 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);

作为交易的一部分执行的参数?有时我会运行查询,有时我会在session.saveOrUpdate 上操作,等等。我有很多 DAO 需要编写,这种代码重复模式让我很困扰。

编辑

session 操作和 HQL(saveOrUpdatedelete 等)之间是否存在直接映射,所以我需要传递给此方法的只是一个查询?

感谢您的见解。

【问题讨论】:

    标签: java mysql database hibernate transactions


    【解决方案1】:

    这样的事情可能就是你所追求的

    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() 等。这些函数与查询之间是否存在有效映射。这样我就可以完全从会话依赖中提取所有查询。
    • @Luke 您可以随时将execute 签名更改为execute(Session session, Transaction tx),并让“查询”在会话对象上执行方法。如果您想将事务和会话部分分开,请使用带有execute(Transaction tx) 方法的MyQuery 类和带有execute(Session session) 方法的MySessionState
    • 谢谢!我做了一些修改,我得到了它的工作。希望有像 C# 这样的任务。
    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2016-11-03
    相关资源
    最近更新 更多