私は、同じエンティティの子を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;
双方向の関連付けは別のテーブルAccountRefに格納されているため、私は結合テーブルを使用しています。これをマップするより良い方法はありますか? –
ジョインテーブルがない場合の動作の実験。結合表なしで双方向マッピングを実現できます。あなたが望んでいない唯一の時間は、関係が可換でない場合です。すなわち、AがBの親である場合、BがAの子であることを意味するものではありません。 –
したがって、結合テーブルを削除し、AccountRefのための別のエンティティを作成し、 AccountRefは、従来のアプリケーションでは必要です。 –