Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate延迟加载与显式查询_Java_Sql_Spring_Hibernate_Jpa - Fatal编程技术网

Java Hibernate延迟加载与显式查询

Java 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

我有一个数据库性能问题

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

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<>();
@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

基本上,我对这两种方法有所怀疑

  • 两个独立的查询,第一个查询通过ID从数据库中获取
    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:-”方面最有意义)