IT이야기

최대 절전 모드: 일대일 지연 로딩, 선택 사항 = false

cyworld 2021. 9. 17. 21:32
반응형

최대 절전 모드: 일대일 지연 로딩, 선택 사항 = false


일대일 지연 로딩 이 최대 절전 모드에서 작동하지 않는 문제에 직면했습니다 . 나는 이미 그것을 해결 했지만 여전히 무슨 일이 일어나는지 제대로 이해 하지 못합니다 .

내 코드( Person - Address도 가져올 때 지연 로딩이 작동하지 않음 ):

@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 주석이 지연 로딩을 달성 하는 어떻게 도움이 되는지 설명해주세요 .

추신 : post1post2를 읽었고 간단한 OneToOne이 게으르지 않을 수 없는 이유를 이해하지만 여전히 optional=false마법을 이해할 수 없습니다 .


연관이 선택적이라면 Hibernate는 질의를 발행하지 않고 주어진 사람에 대한 주소가 존재하는지 알 수 있는 방법이 없다. 따라서 사람을 참조하는 주소가 없을 수 있고 사람을 참조하는 주소가 있을 수 있기 때문에 null로 채울 수 없기 때문에 주소 필드를 프록시로 채울 수 없습니다.

연결을 필수(예: optional=false)로 만들면 연결이 필수 이므로 사용자를 신뢰하고 주소가 존재한다고 가정합니다. 따라서 사람을 참조하는 주소가 있다는 것을 알고 주소 필드를 프록시로 직접 채웁니다.


가장 간단한 방법은 일대다 관계를 가짜로 만드는 것입니다. 이것은 컬렉션의 지연 로딩이 단일 null 허용 속성의 지연 로딩보다 훨씬 쉽기 때문에 작동하지만 일반적으로 복잡한 JPQL/HQL 쿼리를 사용하는 경우 이 솔루션은 매우 불편합니다.

다른 하나는 빌드 시간 바이트코드 계측을 사용하는 것입니다. 자세한 내용은 Hibernate 문서를 참조하십시오: 19.1.7. 지연 속성 가져오기 사용. 이 경우 @LazyToOne(LazyToOneOption.NO_PROXY)게으르게 만들기 위해 일대일 관계에 주석을 추가해야 함을 기억하십시오 . 가져오기를 LAZY로 설정하는 것만으로는 충분하지 않습니다.

마지막 솔루션은 런타임 바이트코드 계측을 사용하는 것이지만 완전한 JEE 환경에서 Hibernate를 JPA 제공자로 사용하는 사람들에게만 작동할 것입니다(이 경우 " hibernate.ejb.use_class_enhancer"를 true로 설정 하면 트릭을 수행해야 합니다: Entity Manager Configuration). 런타임 위빙을 수행하도록 구성된 Spring(일부 이전 애플리케이션 서버에서는 달성하기 어려울 수 있음). 이 경우 @LazyToOne(LazyToOneOption.NO_PROXY)주석도 필요합니다.

ReferenceURL : https://stackoverflow.com/questions/17987638/hibernate-one-to-one-lazy-loading-optional-false

반응형