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