2009-08-26 152 views
2

我有一個數據庫可以有不同類型的relatinships根據上次業務事務中更新的數據。政策編寫應用程序就是一個例子。主表包含通用的政策級別信息,並且有相關的表格包含代理信息和被保險人信息等信息。當第一個事務被髮出時,所有的表都被填充,但是在後續的事務中,只有具有更新的表被持久化到數據庫中。我現在想要做的是創建實現JPA的類,它們將表之間的關係定義爲一對一。然後,我想爲每個關係實現自定義加載器,以確保每次檢索策略實體時都能夠檢索相應表的最新版本。有誰知道如何實現這個邏輯?我曾嘗試使用@NamedNativeQuery並使用HQL,但在兩種情況下,它都告訴我我指定的列名不存在。自定義OneToOne休眠/ JPA協會

任何援助將不勝感激。

代碼已在下面提供,以幫助說明我在做什麼。

@Entity 
@NamedNativeQuery(name = "loadLatestBilling", 
        query = "Select {i.*} from TransactionSummary as ts outer join BillingInfo i on i.systemAssignId=ts.systemAssignId where ts.systemAssignId=:systemAssignId and i.transSeqNo<=:transSeqNo order by i.systemAssignId, i.transSeqNo DESC", 
        resultClass = BillingInfo.class) 

public class CoTransactionSummary implements java.io.Serializable, 
    CdbCoTransactionSummary { 


@OneToOne(targetEntity = BillingInfo.class, fetch = FetchType.LAZY) 
@org.hibernate.annotations.NotFound(action = org.hibernate.annotations.NotFoundAction.IGNORE) 
@Loader(namedQuery = "loadLatestBilling") 
public BillingInfo getBillingInfo() { 
    return billingInfo; 
} 

public void setBillingInfo(BillingInfo billingInfo) { 
    this.billingInfo= billingInfo; 
} 

}

在上面的例子中SystemAssignId將所有的屬於該實體的記錄之間共用。 transSeqNo會針對每個後續事務增加,因此定製加載器會查找與systemAssignId關聯的最高值。

非常感謝您提供任何幫助。

回答

2

您的命名查詢是錯誤的 - 您不能在其中命名參數。你只能有一個位置參數,它將被主鍵值所取代(好吧,複合ID可能不止一個,但不適用於你的情況)。我也不認爲從它返回多個價值是合法的;儘管Hibernate可能會讓它滑動。

現在,由於查詢必須基於PK(BillingInfo PK),因此通過一對一映射來執行您想要的操作並不容易(除非您打算實際每次更新您的CoTransactionSummary時間指向一個合適的BillingInfo;但在這種情況下,你不需要所有的自定義加載的東西)。你基本上需要重寫你的查詢加入到BillingInfo表兩次 - 第一次獲得TransactionSummary PK的BililngInfo記錄與Hibernate提供的PK和第二次獲得最新的BillingInfo記錄。整件事似乎相當混亂。

請考慮使用one-to-many映射代替(您始終可以使BillingInfo集合爲私有,並且只通過公開的getBillingInfo()方法公開適當的實例)。