Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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 JPA实体是否可以有多个OneToMany关联?_Java_Hibernate_Jpa_Orm_Hibernate Mapping - Fatal编程技术网

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