1

オブジェクトを持つAccount単一のJPAクラスを含む3つのJPAクラスがありますAddressCity

public class Account implements java.io.Serializable {

// Fields
private Address address;


//Setters and getters for other fields

@OneToOne(fetch = FetchType.LAZY, mappedBy = "account")
public Address getAccountAddress() {
    return this.address;
}

public void setAccountAddress(Address address) {
    this.address = address;
}

public class Address implements java.io.Serializable {

// Fields
private City city;

//Setters and getters for other fields

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CityId", nullable = false)
public City getCity() {
    return this.city;
}

N+1 選択の問題を解決したかったので、クラスの上で @BatchSize を使用しようとしましたが、データベースへの N+1 呼び出しを停止しなかったため、自分で batchSize を設定する必要がありましたpersistence.xml

 <property name="hibernate.default_batch_fetch_size" value="50" />
 <property name="hibernate.jdbc.batch_size" value="50" />

である1つのエンティティを除いて機能するAddressようになったので、都市とアカウントに対して1つのSQL選択を取得しますが、住所に対してはまだN SQL選択を取得します。唯一の違いは、アカウントとアドレスの関係が 1 対 1 であることです。

私の質問は次のとおりです。

  1. 1 対 1 の関係が、テーブル Address でまだ N を選択している理由でしょうか? なぜ?
  2. 注釈が機能しないのはなぜですか (なぜ にpersistence.xml設定する必要があったのですか)、注釈を有効にするために行うべき設定はありますか?
4

1 に答える 1

2
  1. Hibernate nullable (オプション) OneToOne は遅延できません。この問題といくつかの回避策に関する多くの記事があります。たとえば、これを読んでくださいOneToOne-relationを怠惰にする

  2. どのクラスの上に配置しました@BatchSizeか? Cityクラスの上に置く必要があります。@BatchSize上記の方法も試してくださいgetCity()

于 2013-10-18T15:12:50.923 に答える