programing

휴지 상태에서의 일대일, 다대일 및 일대다 기본 가져오기 유형

kingscode 2022. 9. 27. 21:34
반응형

휴지 상태에서의 일대일, 다대일 및 일대다 기본 가져오기 유형

휴지 상태 매핑의 기본 가져오기 유형은 무엇입니까?

내가 탐구하고 알게 된 것은 다음과 같다.

  • 일대일로 열심입니다.
  • 1 대 다로 게을러요.

하지만 Eclipse에서 테스트한 후, 그것은 모두에게 열심이었다.

JPA 또는 휴지 상태 중 어느 쪽을 사용하고 있는지에 따라 달라집니까?

JPA 또는 휴지 상태 중 어느 쪽을 사용하고 있는지에 따라 달라집니다.

JPA 2.0 사양의 기본값은 다음과 같습니다.

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

그리고 겨울잠은 모든 것이 게으르다.

갱신:

최신 버전의 휴지기는 위의 JPA 기본값과 일치합니다.

질문할 당시 답변이 정확했다는 것을 알고 있습니다.하지만 (지금 저와 같은) 사람들은 왜 WildFly 10이 다르게 동작하는지 궁금해하고 있기 때문에 현재 Hibernate 5.x 버전에 대한 업데이트를 하고 싶습니다.

휴지 상태 5.2 사용자 가이드에 11.2장에 설명되어 있습니다. 가져오기 전략 적용:

휴지 상태 권장 사항은 모든 연관성을 게으름으로 스태틱하게 표시하고 동적인 가져오기 전략을 사용하는 것입니다.이것은 디폴트로는 모든 1대1다대1 어소시에이션을 고속으로 취득해야 한다고 정의되어 있다JPA 사양과 일치하지 않습니다.하이버네이트는 JPA 프로바이더로서 이 디폴트에 준거하고 있습니다.

따라서 Hibernate는 JPA에 대해 위에서 설명한 Ashish Agarwal과 같이 동작합니다.

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

(JPA 2.1 사양 참조)

질문에 답하기 위해, 휴지 상태는 JPA 표준의 구현입니다.휴지 상태에는 독자적인 조작이 있습니다만, 휴지 상태 문서에 의하면,

기본적으로 휴지 상태에서는 수집에는 느린 선택 가져오기를 사용하고 단일 값 연결에는 느린 프록시 가져오기를 사용합니다.이러한 기본값은 대부분의 응용 프로그램에서 대부분의 연결에 적합합니다.

따라서 Hibernate는 선언한 관계 유형에 관계없이 항상 느린 가져오기 전략을 사용하여 모든 개체를 로드합니다.1 대 1 또는 다 대 1의 관계에 있는 단일 오브젝트에 대해 레이지 프록시(초기화를 해제해야 하지만 늘은 아님)를 사용하고 액세스 시도 시 값으로 하이드레이트되는 늘 컬렉션을 사용합니다.

Hibernate를 하지 않는 한 접근을 을 채우려고 는 Hibernate를 지정합니다.fetchType.EAGER.

단일 가치 연관성(예: 일대일 및 다대일):
디폴트 레이지 = 디폴트
프록시 지연 로드: 연관된 엔티티의 프록시 개체가 로드되었음을 나타냅니다.즉, 두 엔티티를 연결하는 ID만 연관된 엔티티의 프록시 개체에 로드됩니다.
예: A와 B는 다대일 어소시에이션이 있는 2개의 엔티티입니다.즉, B마다 A가 여러 개 있을 수 있습니다.A의 모든 오브젝트에는 B의 참조가 포함됩니다.
`

public class A{
    int aid;
    //some other A parameters;
    B b;
}
public class B{
    int bid;
     //some other B parameters;
}

`
A 관계에는 엔티티 A의 열(aid, bid, ...다른 열)이 포함됩니다.
관계 B에는 엔티티 B의 열(bid,...다른 열)이 포함됩니다.

프록시는 A를 가져올 때 B에 대해 id만 가져오고 id만 포함하는 B의 프록시 개체에 저장됩니다.B의 프록시 오브젝트는 최소 필드만 있는B의 서브 클래스인 프록시 클래스의 오브젝트입니다.Bid는 이미 관계 A의 일부이므로 관계 B에서 Bid를 얻기 위해 쿼리를 실행할 필요가 없습니다.엔티티 B의 다른 속성은 입찰 이외의 필드에 액세스할 때만 느릿느릿 로드됩니다.

컬렉션의 경우(다대다 및 일대다):-
디폴트 레이지=true


가져오기 전략(select, join 등)은 지연을 덮어쓸 수 있습니다.즉, lazy='true' 및 fetch='fetch='fetch'의 경우 A를 가져오면 B 또는 Bs(컬렉션의 경우)도 가져옵니다.생각해보면 이유를 알 수 있을 거예요.
단일 값 연결에 대한 기본 가져오기 기능은 "join"입니다.
컬렉션의 기본 가져오기 기능은 "select"입니다.마지막 두 줄을 확인하십시오.나는 그것을 논리적으로 추론했다.

언급URL : https://stackoverflow.com/questions/26601032/default-fetch-type-for-one-to-one-many-to-one-and-one-to-many-in-hibernate

반응형