2012-10-15 79 views
0

這是我在使用jpa時注意到的一件奇怪事情。我使用openjpa 1.0,RAD 8.0和WAS 6.1(不,我不能使用jpa 2)。JPA在lazy fetch域中堅持級聯失敗

我有一個ProductArrangement類,在這個類中有一個Accounts列表。在一個帳戶內,我有一個陳述清單。當我使用初始帳戶和初始陳述創建初始產品安排時,堅持運作完美無瑕。一切都妥善存儲在數據庫中。

後來我想向productArrangement中的帳戶添加一條語句,我可以通過find找到該語句,但persist沒有在帳戶或語句中產生結果。產品安排的變化是成功的。但是,當我在getAccount()。addStatement(語句)之前完成了getAccount()。getStatements()之後,它工作正常。這怎麼可能?是否因爲懶惰的獲取,我必須先做一個獲取?

+0

無碼==沒有調試 –

+0

懶惰獲取不應該是問題,因爲當你調用addStatement,懶惰的收集應填充。請發佈您的ProductArrangement,Account和Statement類的代碼。 – Templar

回答

0

>是否因爲懶惰的抓取,我必須先做一個get?

錯誤...是和否。
是的:它似乎懶惰加載沒有發生,所以你有一個錯誤。
否:它可能不是提供程序代碼中的錯誤,但可能是代碼中的錯誤,代碼爲addAccount()addStatement()

添加新帳戶或聲明應該意味着將關係導航到這些實體集合。它應該自動觸發任何延遲加載,所以這不應該是你的錯誤的原因。

但是,您需要導航通過調用getter方法從您的實體內自動觸發延遲加載。直接訪問實體中的實例字段將永遠不會觸發延遲加載 - 這將成爲代碼中的錯誤,而不是JPA提供程序。

>然而,當我在getAccount()。addStatement(語句)之前完成了getAccount()。getStatements()之後,它正常工作。

也許你的方法是這樣的:

public class Account { 

    // fields and methods ... 

    public void addStatement(Statement s) { 
      this.statementsCollection.add(s); 
    } 
}   

如果是這樣,那是延遲加載的錯誤。它應該是這樣的:

public class Account { 

    // fields and methods ... 

    public void addStatement(Statement s) { 
      this.getStatements().add(s); 
    } 
}   

即那麼你的外部客戶端/測試代碼不需要人爲地調用getAccount()getStatements(),因爲addStatement的內部代碼自動完成它。

:-D