나는 Spring과 Hibernate와 lazy loading에 약간의 어려움이있다. 많은 질문과 답변이 있지만 실제로 내가 원하는 것은 아닙니다.Hibernate Spring JPA는 특정 게으른 관계만을로드한다.
따라서 Car
클래스가 있다고 가정 해 보겠습니다. id
, name
및 doors
, windows
및 wheels
과 일대 다 관계로. 그들이 oneToMany이기 때문에, 나는 선호하는 게으른 기본로드됩니다. 왜냐하면 내가 타이어와 물건을보고 싶지 않은 car
의 이름을보고 싶기 때문입니다. 제 경우에는 제 저장소의 기본 findOne()
메소드를 사용합니다.
하지만 타이어 압력을보고 싶을 때 tires
관계를 초기화해야합니다. 나는 Hibernate.initialize(car.getTires())
을 사용했다. 그러면 데이터베이스에 대해 다른 SELECT
쿼리가 생성됩니다. 이제 데이터베이스 쿼리를 개선하고 tires
으로 car
만 선택하고 windows
및 doors
은 제외하십시오. (조인으로 MySQL에서 가능합니다). 내가 항상 내 물건에 대한 큰 관계가있는 tires
관계를로드하고 싶지 않기 때문에 열심히로드 할 수있는 옵션이 문제가되지 않습니다. 이것은 올바른 데이터를 제공합니까
@Query("SELECT c FROM Car c JOIN FETCH c.tires WHERE c.id = :id")
Car findOneWithTiresLoaded(@Param("id") Long id);
:
나는 다음과 같은 접근 방식을 시도했다. 그러나 저장소에서 반환 된 개체를 분석 한 후 모든 관계가로드 된 것으로 나타났습니다. 따라서tires
관계가있는
car
을 반환 할뿐만 아니라
doors
및
windows
도 반환합니다. 다음은 나에게 (로드 moneToMany 관계와) 같은 출력 원하지 않는
@Query("SELECT c FROM Car c WHERE id = :id")
Car findOneWithTiresLoaded(@Param("id") Long id);
뭔가를 제공합니다. 이 모든 게으른 관계없이 Car
개체 만 출력 할 것으로 예상했습니다.
인터넷 사용자는 Car.getTires().size()
으로 문의하십시오. 다른 SELECT
검색어도 생성됩니다.
Tires
관계 배송만으로 Car
을 선택할 수있는 방법이 있습니까? fetch = FetchType.LAZY
이 없으면 Hibernate.initialize()
또는 size()
방법을 사용 하시겠습니까? 하나의 테이블에 가입하는 것은 어떻게 불가능합니까? 또한, 나는 모든 구성에 XML을 사용하지 않습니다.
감사합니다!
내가'@ Table' 주석을 엔티티에 주석을해야합니까 문서에
Link? 우리가 지금 당장 그렇게하지 않거나 필요하지 않다면 그것을 쓰지 않는 것이 더 낫습니다. 또는 Object 그래프와 함께 사용됩니까? 나는 이것을 지금 시도 할 것이다. 이것이 우리에게 효과가 있다면 당신의 답을 해결책으로 표시 할 것입니다. 답장을 보내 주셔서 감사합니다! – Clemenz
'@ Table'을 생략 할 수는 없으며 단지 엔티티를 정의하는 데 사용됩니다. – Vaelyr
방금 "Car"클래스가 Vehicle 클래스를 확장한다는 것을 알았습니다. 그래서'@ Inheritance' 주석을 사용합니다. (또한 @DiscriminatorValue ('car') 주석). 'Car' 엔티티에서 명명 된 그래프를 사용하려고하면 부팅 할 때 오류가 발생합니다. '이 ManagedType [com.example.domain.Vehicle]'에 주어진 이름 [타이어]가있는 속성을 찾을 수 없습니다. 하지만'Car' 저장소의'Car' 테이블을 쿼리합니다. 무엇이 이것을 일으킬 수 있습니까? – Clemenz