【问题标题】:Hibernate Lazy loading vs explicit queryHibernate 延迟加载与显式查询
【发布时间】:2019-01-24 15:40:34
【问题描述】:

我有一个数据库性能问题。

假设我的数据模型如下所示。

UserTable.java

@Id
@Column(name = "USER_ID", nullable = false)
private Long userId;

// other user fields

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Set<ProfilePhotoTable> photos = new HashSet<>();

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Set<AlbumPhotoTable> photos = new HashSet<>();

PhotoTable.java

@Id
@Column(name = "PHOTO_ID", nullable = false)
private Long photoId;

// other photo fields

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
private UserTable user;

ProfilePhotoTable.java

@Entity
@Table(name = "PROFILEPHOTO")
@PrimaryKeyJoinColumn(name = "PROFILEPHOTO_ID", referencedColumnName = "PHOTO_ID")
public class ProfilePhotoTable extends PhotoTable

AlbumPhotoTable.java

@Entity
@Table(name = "ALBUMPHOTO")
@PrimaryKeyJoinColumn(name = "ALBUMPHOTO_ID", referencedColumnName = "PHOTO_ID")
public class ProfilePhotoTable extends PhotoTable

现在假设我想编写一个查询来获取用户的所有照片 - 所有个人资料照片和所有相册照片。

但是,我不希望每次从数据库中请求用户信息时都获取照片,这就是我在照片字段上指定 fetch = FetchType.LAZY 的原因。

基本上,我对这两种方法有疑问。

  1. 两个独立的查询,第一个通过 ID 从数据库中获取UserTable,第二个获取照片,类似于SELECT * FROM Photo WHERE userId = :userId

  2. 一个查询将join fetch 用户与相应的照片。但是,我不太确定这个查询会如何进行,因为照片在相册和个人资料照片中是分开的。我在article 中发现了类似

    cmets = entityManager.createQuery(

    "选择电脑" + “来自 PostComment 电脑” + "加入获取 pc.post" + "其中 pc.review = :review", PostComment.class) .setParameter("审查", 审查) .getResultList();

应该使用,但我不确定如何将它应用到我的用例中。

问题是,哪种方法在性能方面更好,如果是第二种,查询应该如何构建?

【问题讨论】:

  • ..您可以使user 急切(=“不懒惰”)(以实现您想要的(据我所知)..而“懒惰”在“ N: -" 关联方)

标签: java sql spring hibernate jpa


【解决方案1】:

如果您使用的是 JPA 2.1 或更高版本,您可以使用 @NamedEntityGraph 来控制是否要获取数据“EAGER”或“LAZY”。

这篇文章解释的很好:https://thoughts-on-java.org/jpa-21-entity-graph-part-1-named-entity/

【讨论】:

    【解决方案2】:

    我认为答案取决于您的用户查询中有多少还查询照片。如果答案是一小部分,那么让它保持懒惰是有意义的,这样你就不必一直拉它们。 无论如何,我不会将照片存储在传统的关系数据库类型的设置中。我会将它们放在某种对象存储中,并且只使用 RDBMS 保留 ID。

    【讨论】:

      猜你喜欢
      • 2012-05-21
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2011-07-25
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多