【问题标题】:JPA Hibernate Lazy loading not working as expectedJPA Hibernate 延迟加载未按预期工作
【发布时间】:2013-10-03 03:33:28
【问题描述】:

我有两个具有双向关系@OneToMany 和@ManyToOne 的实体。当我使用如下所示的连接查询查询子表时,hibernate 会自动为每个 MinuteData(子表)查询 StandardDimension(父)表以加载 @ManyToOne 关系,即使它被标记为延迟加载。这会导致数据库性能问题。你能帮我解决这个问题,所以对于每个 MinuteData 它不会加载标准维度记录吗?我正在使用 JPA 2.0 和 hibernate-core-4.1.1.Final。任何帮助将不胜感激。如何阻止休眠加载 StandardDimension 对象?

@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=?

【问题讨论】:

  • 您是否检查过实体的getter setter,有时访问器方法中涉及某些子实体的逻辑会导致选择语句。
  • 我仔细检查了实体,并且没有访问父级 (StandardDimension) 的 hashcode 或 equals 方法。让我知道是否还有其他需要检查的地方。
  • 嘿@Bmis13,我知道这已经快 3 年了,但我只是想知道您是否找到任何解决此问题的方法?

标签: sql hibernate jpa spring-data-jpa


【解决方案1】:

您是否 100% 确定不会触发 StandardDimension 的延迟加载? 有时,它是由过于频繁的 equals 或 hashcode 实现触发的。

如果没有,您能否尝试使用 Criteria API 进行查询,看看是否有任何不同?

【讨论】:

  • 我仔细检查了实体,并且没有访问父级 (StandardDimension) 的 hashcode 或 equals 方法。我将尝试 Criteria API,但我正在使用 spring 数据进行查询。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 2019-04-28
相关资源
最近更新 更多