Java Hibernate如何处理多实体关系?

Java Hibernate如何处理多实体关系?,java,spring,hibernate,Java,Spring,Hibernate,我有一个具有此数据结构的项目: @Entity public class User { @ManyToMany(fetch=FetchType.EAGER, mappedBy="users", cascade= {CascadeType.PERSIST, CascadeType.REMOVE}) public List<Project> projects; } @Entity @Table(name = "project") public class Pro

我有一个具有此数据结构的项目:

@Entity
public class User {
    @ManyToMany(fetch=FetchType.EAGER, mappedBy="users", cascade= {CascadeType.PERSIST, CascadeType.REMOVE})
        public List<Project> projects;
}

@Entity
@Table(name = "project")
public class Project {
    @ManyToMany(cascade= {CascadeType.PERSIST, CascadeType.REMOVE})
    public List<User> users;

    @OneToMany(fetch=FetchType.EAGER, mappedBy="project", cascade = {CascadeType.ALL})
public List<Report> reports;

}

@Entity
public class Report {
@ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "pid")
    public Project project;
}
为了确定是哪个用户创建了报告,我使用userId属性。这个方法现在应该属于UserDAO,还是属于ReportDAO?常识告诉我应该是后者,每个想要创建报表的人都会查看ReportDAO内部。但是如果是在前者中,我只能使用一个DAO来创建报告和更新用户,将更新级联到报告中。 在后者中,需要一个单独的UserDAO实例来创建与报表的关系,更不用说中间项目实体了

一个简单的例子:

public List<Project> getUserProjects(int userId) {
}
public List getUserProjects(int-userId){
}

返回项目对象,但如果放置在ProjectDAO中,则需要使用单独的DAO来首先获取用户对象。放在UserDAO中,它对资源更加友好,但意义不大。

您知道SpringDataJPA项目吗?它可能会解决你的很多问题。为什么需要一个单独的UserDAO来按用户ID查找项目?为什么您需要一个来创建报告?DAO可以访问EntityManager。他们只需要使用它来获取对用户的引用(如果需要的话)。旁注:我真的,真的会避免让你的关联变得急切:每次你加载一个用户,比如显示它的名字,这也会加载它的所有项目和所有项目的所有报告。你真的不想这样做,因为我要么使用属于UserDAO的getUser(int-userId)(错误-多重DAOs),要么重复已经在那里使用的代码(错误-代码重复),要么编写复杂的SQL查询(错误-因为它不是“Hibernate方式”JPA的方法是编写JPQL查询,而不是SQL查询。要么接受用户而不是用户ID作为参数,让调用方使用UserDAO(您无论如何都需要),要么只使用em.find()或em.getReference()获取用户。这只是一个简单的方法调用。它不符合代码重复的条件。
public List<Project> getUserProjects(int userId) {
}