Java Hibernate延迟加载与显式查询
我有一个数据库性能问题 假设我的数据模型如下所示 UserTable.javaJava Hibernate延迟加载与显式查询,java,sql,spring,hibernate,jpa,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.L
@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<>();
@Id
@Column(name = "PHOTO_ID", nullable = false)
private Long photoId;
// other photo fields
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
private UserTable user;
@Entity
@Table(name = "PROFILEPHOTO")
@PrimaryKeyJoinColumn(name = "PROFILEPHOTO_ID", referencedColumnName = "PHOTO_ID")
public class ProfilePhotoTable extends PhotoTable
@Entity
@Table(name = "ALBUMPHOTO")
@PrimaryKeyJoinColumn(name = "ALBUMPHOTO_ID", referencedColumnName = "PHOTO_ID")
public class ProfilePhotoTable extends PhotoTable
ProfilePhotoTable.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<>();
@Id
@Column(name = "PHOTO_ID", nullable = false)
private Long photoId;
// other photo fields
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
private UserTable user;
@Entity
@Table(name = "PROFILEPHOTO")
@PrimaryKeyJoinColumn(name = "PROFILEPHOTO_ID", referencedColumnName = "PHOTO_ID")
public class ProfilePhotoTable extends PhotoTable
@Entity
@Table(name = "ALBUMPHOTO")
@PrimaryKeyJoinColumn(name = "ALBUMPHOTO_ID", referencedColumnName = "PHOTO_ID")
public class ProfilePhotoTable extends PhotoTable
AlbumPhotoTable.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<>();
@Id
@Column(name = "PHOTO_ID", nullable = false)
private Long photoId;
// other photo fields
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
private UserTable user;
@Entity
@Table(name = "PROFILEPHOTO")
@PrimaryKeyJoinColumn(name = "PROFILEPHOTO_ID", referencedColumnName = "PHOTO_ID")
public class ProfilePhotoTable extends PhotoTable
@Entity
@Table(name = "ALBUMPHOTO")
@PrimaryKeyJoinColumn(name = "ALBUMPHOTO_ID", referencedColumnName = "PHOTO_ID")
public class ProfilePhotoTable extends PhotoTable
现在让我们假设我想写一个查询来获取用户的所有照片——所有个人资料照片和所有相册照片
但是,我不希望每次从数据库请求用户信息时都提取照片,这就是为什么我在照片字段上指定了fetch=FetchType.LAZY
基本上,我对这两种方法有所怀疑
UserTable
,第二个查询获取照片,类似于SELECT*from Photo,其中userId=:userId
连接fetch
用户和相应的照片。但是,我不太确定这个查询将如何进行,因为相册和个人资料中的照片是分开的。我发现在这里面
comments=entityManager.createQuery(
“选择电脑”+
“来自后现代个人电脑”+
“加入获取pc.post”+
“where pc.review=:review”,PostComment.class)
.setParameter(“审查”,审查)
.getResultList()
问题是,哪种方法在性能方面更好,如果是第二种方法,那么查询的结构应该如何?我认为答案将取决于用户查询中也查询照片的部分。如果答案是一小部分,那么让它保持懒惰是有意义的,这样你就不必一直拉它们。
无论如何,我不会将照片存储在传统的关系数据库类型的设置中。我会把它们放在某种对象存储中,只使用RDBMS保存ID 如果您使用的是JPA 2.1或更高版本,您可以使用@NamedEntityGraph来控制,如果您想获取“急切”或“懒惰”的数据
这篇文章解释得很好:。你可以让
用户渴望(“不懒惰”)(实现你想要的(据我所知).“懒散”在联想的“N:-”方面最有意义)