2011-12-05 19 views
1

我使用Spring來管理我的服務層中的事務,並使用@Transactional註釋。 這對於急切加載的集合來說很好,但對於延遲加載不利。Hibernate和Spring,加載處於惰性模式的集合

我無法使用OSV模式,我的應用程序是一個獨立的桌面客戶端應用程序。

所以我想到了一個解決方案,而這正是我試圖做的:

public abstract class TransactionTask { 

    public TransactionTask() { 
    } 

    public abstract void job(); 
} 

在我的服務,我有:

@Transactional 
public void doJob(Transactiontask tt){ 
    tt.job(); 
} 

它怎麼我用的是:

myService.doJob(new TransactionTask() { 

    @Override 
    public void job() { 
     //lazy code here 
    } 
}); 

我希望看到這段代碼工作,因爲會話是在doJob方法中打開的(它被標記爲事務性),但它不起作用......例外是no session or session was closed。 爲什麼這段代碼不起作用,以及我只能在需要時才加載集合?

我不想寫一個帶有指定方法的服務來加載集合,這不是一個解決方案。

回答

3

延遲加載並不需要的只是一個會話,它需要Entity連接到會話。在嘗試訪問懶惰字段之前,您需要將對象附加到由@Transactional創建的新會話。

此外,雖然顯然不能使用可用的OSIV servlet過濾器之一,但'pattern'仍然有效。必須有一些可定義的範圍,可以將會話的生命週期耦合到。 (它可能被證明是如此之大以至於還有其他挑戰使得它不值得付出努力,但它仍然是一種選擇。)

0

例如,你有User user對象。它是分離的,這就是爲什麼你有「例外是沒有會議或會議被關閉」。

您可以從道路user=userDao.findById(user.getId())重新讀取它,然後獲取新檢索對象的懶惰集合。

相關問題