簡體   English   中英

休眠事務結束示例

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM