我在担心数据库性能。
假设我的数据模型如下所示。
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
的原因。
基本上,我对两种方法之间存在疑问。
两个独立的查询,第一个通过ID从数据库中提取UserTable
,第二个查询类似SELECT * FROM Photo WHERE userId = :userId
的照片。
一个查询,该查询将join fetch
带相应照片的用户。但是,我不确定该查询的进行方式,因为照片在“相册”和“个人资料”照片中分开。我在此article中发现了
评论= entityManager.createQuery(
“选择PC” + “来自PostComment pc” + “加入获取pc.post” + “ where pc.review =:review”,PostComment.class) .setParameter(“ review”,review) .getResultList();
应该使用,但是我不确定如何将其应用于用例。
问题是,哪种方法在性能方面更好,如果是第二种,应该如何构造查询?
答案 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一起使用。