2013-09-26 4 views
0

다음 두 엔티티가 @OneToMany와 @ManyToOne 인 양방향 관계로있다. 아래 그림과 같이 Join 쿼리를 사용하여 하위 쿼리를 쿼리하면 각 MinuteData (Child 테이블)에 대해 StandardDimension (Parent) 테이블이 @ManyToOne 관계를로드하도록 자동으로 쿼리합니다 (지연로드로 표시되어 있음에도 불구하고). 이로 인해 DB 성능 문제가 발생합니다. 이 문제를 해결할 수 있도록 도와 주시겠습니까? MinuteData마다 표준 측정 기준 레코드가로드되지 않습니까? JPA 2.0과 hibernate-core-4.1.1을 사용하고 있습니다. 최종. 어떤 도움이라도 대단히 감사하겠습니다. 최대 절전 모드에서 StandardDimension 개체를로드하지 못하게하는 방법은 무엇입니까?JPA Hibernate Lazy 로딩이 예상대로 작동하지 않는다.

@Query("SELECT md FROM StandardDimension sd ,MinuteData md where sd.dimensionAK = md.dimensionFK and sd.app = :applicationId and md.timeBucket between :startTime and :endTime ") 
public List<MinuteData> findMinuteDataByTimeBucket(@Param("startTime") Date startTime,  @Param("endTime") Date endTime, @Param("applicationId") String applicationId); 



@Entity (name="StandardDimension") 
@Table (name="STANDARD_DIMENSION") 
public class StandardDimension implements Serializable { 

    @OneToMany (targetEntity=MinuteData.class, fetch=FetchType.LAZY, mappedBy="dimensionFK", cascade=CascadeType.REMOVE) 
    private Set<MinuteData> muniteDateDimensionViaFK = new HashSet<MinuteData>(); 
} 

@Entity (name="MinuteData") 
@Table (name="MINUTE_DATA") 
public class MinuteData implements Serializable { 
........ 

    @ManyToOne (fetch=FetchType.LAZY) 
    @JoinColumn(name="DIMENSION_FK", referencedColumnName = "DIMENSION_AK", nullable=false , unique=false , insertable=true, updatable=true) 
    private StandardDimension dimensionFK; 
......... 
    } 
Here is SQL Statement form console: 
    Hibernate: 
     select 
      minutedata1_.minute_data_pk as minute1_1_, 
      minutedata1_.created_date as created2_1_, 
      minutedata1_.data_obj as data3_1_, 
      minutedata1_.dimension_fk as dimension6_1_, 
      minutedata1_.modified_date as modified4_1_, 
      minutedata1_.time_bucket as time5_1_ 
     from 
      standard_dimension standarddi0_, 
      minute_data minutedata1_ 
     where 
      standarddi0_.dimension_ak=minutedata1_.dimension_fk 
      and standarddi0_.app=? 
      and (
       minutedata1_.time_bucket between ? and ? 
      ) 
    Hibernate: 
     select 
      standarddi0_.standard_dimensions_pk as standard1_2_0_, 
      standarddi0_.app as app2_0_, 
      standarddi0_.created_date as created3_2_0_, 
      standarddi0_.data_center as data4_2_0_, 
      standarddi0_.dimension_ak as dimension5_2_0_, 
      standarddi0_.env as env2_0_, 
      standarddi0_.last_seen as last7_2_0_, 
      standarddi0_.modified_date as modified8_2_0_, 
      standarddi0_.server as server2_0_, 
      standarddi0_.app_version as app10_2_0_ 
     from 
      standard_dimension standarddi0_ 
     where 
      standarddi0_.dimension_ak=? 
+0

엔티티의 getter setter를 확인 했습니까? 일부 자식 엔티티가 관련된 접근 자 메서드의 논리에서 select 문이 발생하는 경우가 있습니다. –

+0

엔티티를 두 번 확인했는데 부모 (StandardDimension)에 액세스하는 hashcode 또는 equals 메서드가 없습니다. 내가 확인해야 할 다른 것이 있으면 알려줘. – Bmis13

+0

안녕하세요 @ Bmis13, 거의 3 년이되었지만이 문제에 대한 해결책을 찾았는지 알고 싶었습니까? – jon

답변

1

StandardDimension의 지연로드가 발생하지 않도록 100 % 확신하십니까? 가끔 equals 나 해시 코드가 너무 많이 구현되어 트리거되는 경우가 있습니다.

그렇지 않은 경우 Criteria API를 사용하여 어떤 차이가 있는지 확인해 볼 수 있습니까?

+0

엔티티를 두 번 확인했는데 부모 (StandardDimension)에 액세스하는 hashcode 또는 equals 메서드가 없습니다. Criteria API를 시도 할 것이지만 Query 용 Spring 데이터를 사용하고 있습니다. 제안에 감사드립니다. – Bmis13

관련 문제