2011-12-20 44 views
0

我有兩個對象Customer和Transaction。他們看起來像這樣:如何加載id,但不包含ManyToOne映射中不存在的對象

@Entity 
class Transaction { 
    @Id 
    long id;   

    @Column("CUSTOMER_ID") 
    long customerId; 

    @ManyToOne 
    @JoinColumn(name="CUSTOMER_ID", insertable=false, updatable=false, nullable=false) 
    Customer customer 
    ... 
} 

@Entity 
class Customer { 
    @ID 
    long id; 
    ... 
} 

問題是我們使用假客戶號碼來識別某些類型的交易。這是一種傳統的做法,我無法做出任何改變,我的控制之外的其他各種過程依賴於此。

我希望能夠做的是獲得客戶號碼返回虛擬客戶交易,並在我的交易對象只有一個空客戶。對於不是虛擬客戶的交易,我希望設置客戶對象。理想情況下,我寧願不必測試虛擬客戶號碼併發出單獨的查詢。

如何編寫查詢並映射我的對象來執行此操作?現在我嘗試的所有事情,最終都會出現虛擬策略ID的EntityNotFound異常。

回答

0

使用UNION,您可以選擇正確的客戶記錄,並與默認的「NO SUCH CUSTOMER」記錄聯合,確保默認值第二次通過順序排序並僅取得第一個結果。

0

在JPA中,如果ManyToOne沒有引用任何內容,您應該只是獲取null。不知道你如何獲得EntityNotFound。這可能是您JPA提供商的特定問題。

+0

我正在使用hibernate。問題不在於CUSTOMER_ID爲空時,它不是null,而是不引用對象。我們擁有沒有相應客戶對象的特定虛擬客戶ID。正如我上面所說的,不幸的是,他們是一個遺留的人造物,我不能刪除,因爲其他進程和系統依賴它們。 – AndrewMcCall 2011-12-20 18:38:40

+0

此問題特定於Hibernate使用代理實現延遲加載的方式,不使用代理的其他JPA實現不會遇到此問題。讓它成爲EAGER應該解決這個問題。 – James 2011-12-21 14:42:01

+0

這並不是說實體在存在時不會被加載,而是工作正常。問題是當一個實體不存在時,當它是其中一個虛擬客戶時,它引發異常。 – AndrewMcCall 2011-12-23 18:15:33

相關問題