Hibernate延迟加载与显式查询

时间:2019-01-24 15:40:34

标签: java sql spring hibernate jpa

我在担心数据库性能。

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

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中发现了

    评论= entityManager.createQuery(

    “选择PC” + “来自PostComment pc” + “加入获取pc.post” + “ where pc.review =:review”,PostComment.class) .setParameter(“ review”,review) .getResultList();

应该使用,但是我不确定如何将其应用于用例。

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

2 个答案:

答案 0 :(得分:1)

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

本文对此进行了很好的解释:https://thoughts-on-java.org/jpa-21-entity-graph-part-1-named-entity/

答案 1 :(得分:0)

我认为答案将取决于您的用户查询中还查询照片的比例。如果答案很小,那么保持懒惰是有意义的,这样您就不必一直拉扯它们。 无论如何,我不会将照片存储在传统的关系数据库类型的安装程序中。我会将它们放在某种对象存储区中,而只保留ID与RDBMS一起使用。