java - Hibernate事务结束示例

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

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

最佳答案

我在这里没有发现您的代码有任何问题。正如 @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";
}

关于java - Hibernate事务结束示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5166698/

相关文章:

java - 将 Object[] 数组转换为 String[] 数组 RxJava

java - 多次使用@Autowired

java - hibernate ;高质量语言;为什么删除查询不起作用,但选择呢?

c# - 在 WinForm 应用程序中使用工作单元模式时应如何处理事务

android - 为什么定义 Flowable 我可以接收数据库的更新

java - 比较方法如何工作?

java - Freemarker 中的管道流问题

java - Mockito,带有检查异常的void方法

java - 具有集合的 Hibernate 或 SQL 查询 M-N 成员?

java - Hibernate 提供下一个生成的 id 32768 等等 65536, 98304