78

1 対 1 の遅延読み込みが休止状態で機能しないという問題に直面しました。私はすでにそれを解決しましたが、まだ何が起こるかを正しく理解していません。

私のコード(人を引っ張ると、ここでは遅延読み込みが機能しません-アドレスもフェッチされます):

@Entity
public class Person{

  @Id
  @SequenceGenerator(name = "person_sequence", sequenceName = "sq_person")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "person_sequence")
  @Column(name = "id")
  private long personID;

  @OneToOne(mappedBy="person", cascade=CascadeType.ALL, fetch = FetchType.LAZY)
  private Adress address;
  //.. getters, setters
}

@Entity
public class Address {

  @Id
  @Column(name="id", unique=true, nullable=false)
  @GeneratedValue(generator="gen")
  @GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="person"))
  private long personID;

  @PrimaryKeyJoinColumn
  @OneToOne
  private FileInfo person;
}

しかしoptional=false: OneToOne 関係を追加すると、遅延読み込みが正常に機能します

@OneToOne(mappedBy="person", cascade=CascadeType.ALL, optional = false, fetch = FetchType.LAZY)
private Adress address;

質問/懇願:optional=false注釈が遅延読み込みを実現するのにどのように役立つかを説明してください。

PS post1post2の投稿を読み、単純な OneToOne が怠惰にならない理由を理解しましたが、それでもoptional=false魔法を理解することはできません。

4

2 に答える 2

12

最も簡単な方法は、1 対多の関係を偽装することです。コレクションの遅延読み込みは、単一の null 許容プロパティの遅延読み込みよりもはるかに簡単であるため、これは機能しますが、一般に、複雑な JPQL/HQL クエリを使用する場合、このソリューションは非常に不便です。

もう 1 つは、ビルド時のバイトコード インストルメンテーションを使用することです。詳細については、Hibernate のドキュメント: 19.1.7 を参照してください。遅延プロパティ フェッチの使用。この場合@LazyToOne(LazyToOneOption.NO_PROXY)、レイジーにするために、1 対 1 の関係に注釈を追加する必要があることに注意してください。fetch を LAZY に設定するだけでは不十分です。

最後の解決策は、ランタイム バイトコード インスツルメンテーションを使用することですが、本格的な JEE 環境で Hibernate を JPA プロバイダーとして使用する場合 (このような場合は、" hibernate.ejb.use_class_enhancer" を true に設定するとうまくいくはずです: エンティティ マネージャー構成)、または Hibernate を使用する場合にのみ有効です。ランタイム ウィービングを行うように構成された Spring (一部の古いアプリケーション サーバーでは実現が難しい場合があります)。この場合、@LazyToOne(LazyToOneOption.NO_PROXY)注釈も必要です。

于 2016-04-11T05:22:04.407 に答える