繁体   English   中英

休眠事务结束示例

[英]Hibernate transaction end example

这是java中休眠用法的一个非常简单的示例:一个函数,当它被调用时,它将在数据库中创建一个新对象。 如果一切顺利,更改将被存储并立即可见(没有缓存问题)。 如果发生故障,应还原数据库,就像从未调用此函数一样。

public String createObject() {
    PersistentTransaction t = null;
    try {
        t = PersistentManager.instance().getSession().beginTransaction();
        Foods f = new Foods(); //Foods is an Hibernate object
        //set some values on f
        f.save();
        t.commit();
        PersistentManager.instance().getSession().clear();
        return "everything allright";
    } catch (Exception e) {
        System.out.println("Error while creating object");
        e.printStackTrace();
        try {
            t.rollback();
            System.out.println("Database restored after the error.");
        } catch (Exception e1) {
            System.out.println("Error restoring database!");
            e1.printStackTrace();
        }
    }
    return "there was an error";
}

有什么错误吗? 你会改变/改善任何东西吗?

我在这里看不到您的代码有什么问题。 正如@Vinod所说,我们依靠像Spring这样的框架来处理乏味的样板代码。 毕竟,您不希望这样的代码存在于每种可能的DAO方法中。 它们使事情难以阅读和调试。

一种选择是使用AOP,您可以在DAO方法上应用AspectJ的“ around”建议来处理事务。 如果您对AOP不满意,那么如果不使用Spring之类的框架,则可以编写自己的样板包装器。

这是我精心设计的一个示例,可能会给您一个想法:-

// think of this as an anonymous block of code you want to wrap with transaction
public abstract class CodeBlock {
    public abstract void execute();
}

// wraps transaction around the CodeBlock
public class TransactionWrapper {

    public boolean run(CodeBlock codeBlock) {
        PersistentTransaction t = null;
        boolean status = false;

        try {
            t = PersistentManager.instance().getSession().beginTransaction();

            codeBlock.execute();

            t.commit();
            status = true;
        }
        catch (Exception e) {
            e.printStackTrace();
            try {
                t.rollback();
            }
            catch (Exception ignored) {
            }
        }
        finally {
            // close session
        }

        return status;
    }
}

然后,您的实际DAO方法将如下所示:-

TransactionWrapper  transactionWrapper  = new TransactionWrapper();

public String createObject() {
    boolean status = transactionWrapper.run(new CodeBlock() {
        @Override
        public void execute() {
            Foods f = new Foods();
            f.save();
        }
    });

    return status ? "everything allright" : "there was an error";
}

除非您已将会话注入到持久对象中,否则保存将通过会话而不是对象进行。

最后,也要关闭会议

finally {
   //session.close()
}

建议:如果发布的这段代码是出于学习目的,那很好,否则,我建议使用Spring来管理该样板文件,并且只担心保存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM