2017-04-04 7 views
1

후드 아래 지속성 공급자는 find() 또는 getReference()을 사용하여 ManyToOne 주석 필드의 getter 메소드를 호출 할 때 엔티티를로드합니까?JPA @ManyToOne - EntityNotFoundException 또는 null 값?

getReference()가 발생 EntityNotFound 경우

find() 반환 nullEntityNotFoundException

그래서 게터는 경우에 무엇을해야 엔티티를 찾을 수 없습니다? 후드 아래에서

답변

0

우리가 ManyToOne 주석 필드의 getter 메소드를 호출 할 때 지속성은 EclipseLink 등의 제공자 또는

uses find() or getReference() 

엔티티를로드하는 데 최대 절전 모드?

Hibernate는 뒤에서 find 또는 getRefernce를 호출하지 않습니다. 이러한 메소드는 클라이언트가 엔티티 또는 프록시를 찾기 위해 사용됩니다.

@ManyToOne 연관이있는 경우, Hibernate는 뒤에서 JPA @ManyToOne이 외래 키일 뿐이므로 상위 엔티티를 가져 오는 방법을 이미 알고 있습니다.

그러나 하위 엔티티를로드 한 원본 ResultSet에도 FK 값이 포함되어 있기 때문에 Hibernate는 연관을 탐색 할 때 이미 FK 값을 알고 있습니다. 아무 것도 발견되지 않으면

  1. 첫 번째 레벨 캐시는
  2. 을 필요로하는 개체를 검색합니다 다음과 같이로드 사이클이기 때문에 최대 절전 모드가 DB로 이동하는

    그러나 의무적이 아니다 1 차 레벨 캐시에서 Hibernate는 2 차 레벨 캐시에서 그것을 찾는다.

  3. 엔티티가 여전히 발견되지 않으면 연관은 LAZY 여야하므로 2 차 조회가 발행됩니다.

따라서 실제 존재하지 않는 부모 레코드를 참조 할 수 없기 때문에 FK를 탐색 할 때 EntityNotFoundException을 사용할 필요가 없습니다. FK를 사용하지 않았고 데이터베이스에 이러한 불일치가 있다면 Hibernate는 실제로 예외를 던질 것입니다. 그러나 그것은 데이터 모델링 디자인이 손상되었다고 말할 것입니다.

+0

답변을 주셔서 감사합니다. 내 프로젝트 중 하나에서 EclipseLink를 사용하고 있으며 FK 비용을 적용하지 않았으며 ManyToOne 제휴에서 getMyEntity를 호출 할 때 단순히 null 값을 얻습니다. JPA 사양과 일관성이 있습니까? – GionJh

+0

EclipseLink 팀에 문의하십시오. 나는 JPA가 존재하지 않는 협회를 탐색하기위한 표준 결과가 무엇인지 명시하고 있다고 생각하지 않습니다. –

+0

블라드에게 고마워! – GionJh