gpt4 book ai didi

java - Hibernate 事务结束示例

转载 作者:行者123 更新时间:2023-11-30 07:34:30 25 4
gpt4 key购买 nike

这是在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com