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