Java 从Hibernate处理“递归”实体检索
我想知道在处理通过Hibernate从数据库中检索可能非常大的实体时,什么是最佳实践或通常的方法 考虑以下POJO: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
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();