Hibernate事务结束示例

时间:2011-03-02 11:15:11

标签: java hibernate persistence

这是java中hibernate用法的一个非常简单的例子:一个函数,当它被调用时,它会在数据库中创建一个新对象。如果一切顺利,更改将立即存储并可见(无缓存问题)。如果某些内容失败,则应该恢复数据库,就像从未调用此函数一样。

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";
}

有错误吗?你会改变/改进什么吗?

2 个答案:

答案 0 :(得分:3)

我的代码没有看到任何问题。正如@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";
}

答案 1 :(得分:1)

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

最后还要关闭会话

finally {
   //session.close()
}

建议:如果发布此代码是为了学习目的那么它没问题,否则我建议使用Spring来管理这个样板文件并且只关心保存。