2013-09-26 54 views
0

我有以下兩個實體具有雙向關係@OneToMany和@ManyToOne。當我使用連接查詢查詢子表時,hibernate會自動查詢每個MinuteData(子表)的StandardDimension(Parent)表,以加載@ManyToOne關係,即使它被標記爲延遲加載。這導致數據庫性能問題。你能幫我解決這個問題,所以對於每個MinuteData它不會加載標準維度記錄?我正在使用JPA 2.0和hibernate-core-4.1.1.Final。任何幫助將不勝感激。如何阻止加載StandardDimension對象的hibernate?JPA休眠惰性加載不能按預期方式工作

@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

hey @ Bmis13,我知道已經差不多3年了,但我只想知道你是否找到了解決這個問題的方法? – jon

回答

1

您是否100%肯定沒有東西會觸發延遲加載StandardDimension? 某些時候,由於過分執行equals或hashcode而觸發它。

如果不是,你可以使用Criteria API來試試你的查詢,看它是否有什麼區別?

+0

我重複檢查了實體,並且沒有訪問父級(StandardDimension)的散列碼或等號方法。我將嘗試Criteria API,但我使用彈簧數據進行查詢。感謝您的建議。 – Bmis13