Hibernate の 2 次キャッシュを有効にしようとしていますが、OneToOne 関係に対して複数のクエリが発行されることを回避できません。
私のモデルは次のとおりです。
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Business {
@OneToOne(mappedBy = "business", cascade = {CascadeType.REMOVE}, fetch = FetchType.EAGER)
private Address address;
}
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Address {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "business_id", unique = true, nullable = false, foreignKey = @ForeignKey(name = "fk_business_id"))
private Business business;
}
キャッシュ内のwith idを使用して実行するsession.get(Business.class, id)
と、読み込み用のクエリは発行されませんが、.Business
id
Business
Address
Address がリレーションの所有者で、Business キャッシュ エントリにAddress.id
情報がないことは理解していますが、*ToMany リレーションと同じメカニズムを適用して、フィールドごとに新しいキャッシュ領域を作成することで、この問題を解決できないでしょうか? ビジネス 1 がアドレス 2 に関連していると仮定すると、最初の読み込み後にキャッシュに次のリージョンとエントリが存在することになります。
Business
Business#1 -> [business model]
Business.address
Business.address#1 -> [2]
Address
Address#2 -> [address model]
で注釈Address.business
を付け@NaturalId
、Address
クラスに@NaturalIdCache
. キャッシュ領域が作成され、移入されますが、session.get(Business.class, id)
使用されません。
私のBusiness
モデルには、外部キーが (ビジネスではなく) 反対側にある OneToOne リレーションがさらに多くあり、データベース サーバーが HTTP リクエストごとに数十のクエリを処理する必要があるため、一度にいくつかをリストする必要があります。
Hibernate のユーザー ガイド、2LC に関する Vlad Mihalcea の説明とそのメモリ内脱水形式、Baeldung の説明、およびその他の StackOverflow の回答をいくつか読みましたが、これを解決する方法が見つかりません。