我有一个包含此数据结构的项目:
@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;
}
如何编写DAO以避免在另一个DAO中使用DAO?具体来说,如果我需要一个方法:
public void createUserReport(int userId) {
}
要确定哪个用户创建了报告,我使用userId属性。此方法现在应该属于UserDAO还是ReportDAO?常识告诉我它将是后者,每个想要创建报告的人都会看到ReportDAO。但如果它是前者,我只能使用一个DAO来创建报告并更新用户,将更新级联到报告。 在后者中,需要单独的UserDAO实例来创建与报告的关系,更不用说中间项目实体了。
一个更简单的例子:
public List<Project> getUserProjects(int userId) {
}
返回Project对象,但是如果放在ProjectDAO中,则需要使用单独的DAO来首先获取User对象。放在UserDAO中它变得更加资源友好,但没有多大意义。