2009-08-26 17 views
2

私は、前回の業務トランザクション中に更新されたデータに基づいて、さまざまな種類のリレーショナルシップを持つことができるデータベースを持っています。ポリシー作成アプリケーションの例があります。メインテーブルには一般的なポリシーレベルの情報が含まれており、エージェントの情報や被保険者情報などの情報を含む関連テーブルがあります。最初のトランザクションが発行されると、すべての表が移入されますが、後続のトランザクションでは、更新を持つ表のみがデータベースに保持されます。私が今しようとしているのは、テーブル間の関係を一対一で定​​義するJPAを実装するクラスを作成することです。私は各関係のカスタムローダーを実装して、ポリシーエンティティを取得するたびに対応するテーブルの最新バージョンを取得できるようにしたいと考えています。誰もこのロジックを実装する方法を知っていますか? @NamedNativeQueryを使用してHQLを使用しようとしましたが、両方のインスタンスで、指定した列名が存在しないことがわかります。カスタムOneToOne Hibernate/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

あなたの名前付きクエリは間違っています。名前付きクエリを使用することはできません。プライマリキーの値に置き換えられる1つの位置パラメータのみを持つことができます(複合IDの場合は複数ある必要がありますが、あなたの場合は該当しません)。私はまたそれから複数の価値を返すことが合法だとは思わない。 Hibernateはそれを滑らせるかもしれませんが。

ここで、クエリーはPK(BillingInfo PK)に基づいている必要があるため、1対1マッピングを使用して簡単に行うことはできません(実際にCoTransactionSummary適切なBillingInfoを指す時間が必要ですが、その場合はカスタムローディングのすべてを必要としません)。あなたは基本的にBillingInfoテーブルに参加するためにクエリを書き直す必要があります - 最初にTransactionSummary PKのBililngInfoレコードを取得するには、Hibernateから提供されたPKを使用し、最新のBillingInfoレコードを取得します。全体がかなり乱雑に思えます。

代わりにone-to-manyマッピングを使用することを検討してください(BillingInfoコレクションを非公開にして、公開getBillingInfo()メソッドを使用して適切なインスタンスのみを公開することができます)。

関連する問題