2010-12-13 15 views
0

私は、同じエンティティの子を0個以上持つことができるエンティティを持っています。また、エンティティは同じエンティティの0または1つの親を持つことができます。自己へのJoinTable(親/子)は、ロード時に常にテーブルに結合するために結合します

テーブル構造

Account (
    AccountId PK, 
    Name char 
    etc... 
) 

AccountRef (
    ChildId PK, FK references Account(AccountId) 
    ParentId PK, FK references Account(AccountId) 
) 

すべては私がアカウントをロードする任意の時間を除いて正常に動作している、加入常に結合テーブルの上に行われている(私はAccountRefレコードがあるかどうかを確認すると仮定しています) 。クエリはAccountエンティティに戻ってこないので、account.getMasterAccount()を実行するとAccountRefに参加してからAccountに戻ってマスターを取得します。この場合も、これはすべて正しいですが、必要なときに2回、必要がないときに1回、結合が行われるため最適ではありません。

LazyToOneに計測器を使用する唯一の方法はありますか?これをマッピングする方法はありますか?これは従来のテーブル構造であり、変更できません。

@Entity 
Account { 

@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="masterAccount") 
    private Set<Account> subAccount; 

@ManyToOne(fetch=FetchType.LAZY) 
@JoinTable(name="AccountRef", 
     joinColumns = @JoinColumn(name="childId", referencedColumnName="accountId"), 
     inverseJoinColumns = @JoinColumn(name="parentId", referencedColumnName="accountId") 
    ) 
    private Account masterAccount; 

答えて

0

なぜ結合テーブルが必要ですか? 1対1の場合、それは必要ではありません。 JoinTableアノテーションを削除することはできますか?あなたがそれを必要とする理由がありますか?

+0

双方向の関連付けは別のテーブルAccountRefに格納されているため、私は結合テーブルを使用しています。これをマップするより良い方法はありますか? –

+0

ジョインテーブルがない場合の動作の実験。結合表なしで双方向マッピングを実現できます。あなたが望んでいない唯一の時間は、関係が可換でない場合です。すなわち、AがBの親である場合、BがAの子であることを意味するものではありません。 –

+0

したがって、結合テーブルを削除し、AccountRefのための別のエンティティを作成し、 AccountRefは、従来のアプリケーションでは必要です。 –

関連する問題