Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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_Spring_Hibernate_Spring Mvc_Jpa - Fatal编程技术网

Java 从Hibernate处理“递归”实体检索

Java 从Hibernate处理“递归”实体检索,java,spring,hibernate,spring-mvc,jpa,Java,Spring,Hibernate,Spring Mvc,Jpa,我想知道在处理通过Hibernate从数据库中检索可能非常大的实体时,什么是最佳实践或通常的方法 考虑以下POJO: class Movie implements Serializable { @Id private long id; private String title; @ManyToMany(mappedBy="acted_movies") private Set<Person> cast; } class Perso

我想知道在处理通过Hibernate从数据库中检索可能非常大的实体时,什么是最佳实践或通常的方法

考虑以下POJO:

class Movie implements Serializable {
    @Id 
    private long id;

    private String title;

    @ManyToMany(mappedBy="acted_movies")
    private Set<Person> cast;
}    

class Person implements Serializable {
    @Id
    private long id;

    private String name;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "Person_Movie_Actor", 
         joinColumns = { @JoinColumn(name = "person_id") }, 
         inverseJoinColumns = { @JoinColumn(name = "movie_id") })
    private Set<Movie> acted_movies;
}
由于属性的递归性质,我担心返回对象的大小:一部电影有一组演员,每个演员都参与了电影,等等

当然,我可以编写自己的自定义SQL查询,以便只返回相关人员的ID,而不是对象的ID。然而,这需要定义新的类,随后的数据库更新可能会变得很麻烦

有没有关于如何轻松管理的想法


此外,这里似乎并不真正需要转换器或映射器,因为我仍然需要在内存中加载完整的对象。

您只能获得ID,而无需创建任何其他类

下面是一种获取电影人物ID的方法

//em is entity manager
TypedQuery<Long> query = em.createQuery(
  "SELECT m.cast.id FROM Movie AS m where m.id=:movieId", Long.class);
query.setParameter("movieId",1l);
List<Long> personIds = query.getResultList();

这似乎是由Hibernate直接处理的。可以指定FetchType.LAZY作为用于加载实体的提取类型,这不会加载关系OneToOne等

然后可以显式调用Hibernate.initialize。。以显式加载关系

还值得注意的是,Hibernate.initialize。。不会递归初始化所有成员。更多信息请参见此页

//em is entity manager
TypedQuery<Long> query = em.createQuery(
  "SELECT m.cast.id FROM Movie AS m where m.id=:movieId", Long.class);
query.setParameter("movieId",1l);
List<Long> personIds = query.getResultList();