3

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)と、読み込み用のクエリは発行されませんが、.BusinessidBusinessAddress

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を付け@NaturalIdAddressクラスに@NaturalIdCache. キャッシュ領域が作成され、移入されますが、session.get(Business.class, id)使用されません。

私のBusinessモデルには、外部キーが (ビジネスではなく) 反対側にある OneToOne リレーションがさらに多くあり、データベース サーバーが HTTP リクエストごとに数十のクエリを処理する必要があるため、一度にいくつかをリストする必要があります。

Hibernate のユーザー ガイド、2LC に関する Vlad Mihalcea の説明とそのメモリ内脱水形式、Baeldung の説明、およびその他の StackOverflow の回答をいくつか読みましたが、これを解決する方法が見つかりません。

4

0 に答える 0