Java JPA实体是否可以有多个OneToMany关联?
向我的实体类添加两个Java JPA实体是否可以有多个OneToMany关联?,java,hibernate,jpa,orm,hibernate-mapping,Java,Hibernate,Jpa,Orm,Hibernate Mapping,向我的实体类添加两个OneToMany关联似乎不起作用。如果我移除其中一个,效果很好 @Entity @Table(name = "school") public class School { private List<Teacher> teachers; private List<Student> students; @OneToMany(cascade=CascadeType.ALL, mappedBy = "school", fetch
OneToMany
关联似乎不起作用。如果我移除其中一个,效果很好
@Entity
@Table(name = "school")
public class School {
private List<Teacher> teachers;
private List<Student> students;
@OneToMany(cascade=CascadeType.ALL, mappedBy = "school", fetch = FetchType.EAGER)
public List<Teacher> getTeachers()
return this.teachers;
}
public void setTeachers(List<Teacher> teachers) {
this.teachers = teachers;
}
@OneToMany(cascade=CascadeType.ALL, mappedBy = "school", fetch = FetchType.EAGER)
public List<Student> getStudents()
return this.students;
}
public void setStudents(List<Student> teachers) {
this.students = students;
}
}
我还有带有正确注释的id
字段(@id
,@GeneratedValue
)
因此,在我看来,在同一个类中,我不能有多个@OneToMany
。这是正确的吗?为什么FetchType.EAGER是个坏主意
您可以有多个一对多关联,只要只有一个关联
但是,即使您可以使用Set
而不是List
来绕过这一点,这也不是一件好事,因为最终会得到笛卡尔积
避免笛卡尔积
最好的办法是根本不要使用“渴望”。您应该使用JOIN fetch JPQL指令对所有关联使用LAZY
,并立即获取多个多对一
和1对一
关联,最多一个1对多
关联
如果要获取多个one-to-many
关联,可以对第二个或第三个关联使用Hibernate.initialize(proxy)
方法
获取多个父集合和多个子集合
但是,如果您有一个需要加载多个子关联的父实体集合,那么您可以在第一个集合中使用JOIN FETCH
,因为如果您尝试急切地获取多个子集合,那么最终将得到笛卡尔积
因此,假设您希望获取多个Post
父实体及其comments
和tags
集合,您可以在第一次查询中获取comments
:
List<Post> _posts = entityManager
.createQuery(
"select distinct p " +
"from Post p " +
"left join fetch p.comments " +
"where p.id between :minId and :maxId ", Post.class)
.setParameter("minId", 1L)
.setParameter("maxId", 50L)
.setHint(QueryHints.PASS_DISTINCT_THROUGH, false)
.getResultList();
这是怎么回事
第一个查询获取附加到当前EntityManager
的Post
实体。为每个Post
实体获取comments
集合,但是标记
集合由代理表示
第二个查询将获取
标记
,但是由于Hibernate已经缓存了Post
实体,它将用从数据库中获取的实际标记
条目替换标记
代理集合。我认为您的@manytone和@JoinColumn注释应该放在私立学校的教师和学生类型的财产上。我注意到您在这两种方法的公共getter方法中都有它。不,它一点都不正确。你想要多少就有多少。“它不工作”是什么意思?可能是两个关系同名的问题?检索用户时,数据库不会返回任何内容。没有stacktrace,甚至没有警告。我可以看到hibernate正在映射所有classes@Jens变量在两个类中都被称为school
,因此它们必须具有相同的mappedBy
值,不是吗?那么hibernate执行的是什么sql语句呢?今天晚些时候我将尝试一下,如果有效,我将接受您的答案。提前谢谢,我有一段时间遇到了一个问题,如果一个域名中的一个被删除了,那么在双方拥有的域名中只有@ManyToOne是相同的呢?
List<Post> _posts = entityManager
.createQuery(
"select distinct p " +
"from Post p " +
"left join fetch p.comments " +
"where p.id between :minId and :maxId ", Post.class)
.setParameter("minId", 1L)
.setParameter("maxId", 50L)
.setHint(QueryHints.PASS_DISTINCT_THROUGH, false)
.getResultList();
_posts = entityManager
.createQuery(
"select distinct p " +
"from Post p " +
"left join fetch p.tags t " +
"where p in :posts ", Post.class)
.setParameter("posts", _posts)
.setHint(QueryHints.PASS_DISTINCT_THROUGH, false)
.getResultList();