这是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";
}
有错误吗?你会改变/改进什么吗?
答案 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来管理这个样板文件并且只关心保存。