[英]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.