我有一个与连接表建立的ManyToMany关系,它与Java Persistence wiki Example of a ManyToMany relationship annotations中描述的连接表完全相同。使用Employees&的wiki示例项目作为参考,示例中列出的代码可以很好地创建三个表:EMP,PROJ和EMP_PROJ连接表。我想要做的是在单独的实体中使用该EMP_PROJ连接表。我不想在EMP_PROJ连接表中添加其他列。例如,假设管理员将项目与员工关联。该列表存储在EMP_PROJ中。我想要做的是创建一个名为ManagerReport的独立实体,该实体将为员工返回与该员工关联的项目列表。然后,经理可以输入有关员工每个项目的具体信息,如开始日期,结束日期,绩效等。
以下是从维基页面中提取的表格和示例代码。
EMPLOYEE (table)
ID FIRSTNAME LASTNAME
1 Bob Way
2 Sarah Smith
EMP_PROJ (table)
EMP_ID PROJ_ID
1 1
1 2
2 1
PROJECT (table)
ID NAME
1 GIS
2 SIG
@Entity
public class Employee {
@Id
@Column(name="ID")
private long id;
...
@ManyToMany
@JoinTable(
name="EMP_PROJ",
joinColumns={@JoinColumn(name="EMP_ID", referencedColumnName="ID")},
inverseJoinColumns={@JoinColumn(name="PROJ_ID", referencedColumnName="ID")})
private List<Project> projects;
...
}
答案 0 :(得分:1)
您必须创建一个 ManagerReportProject 实体,该实体使用 @Table 注释映射到 EMP_PROJ 表。
在员工实体中,代替项目集合的 @ManyToMany 映射,使用 @OneToMany 映射将集合映射到 ManagerReportProject 实体。
您仍然可以获得员工项目列表,因为每个ManagerReportProject都会指向Project。您甚至可以在Employee中创建一个帮助器 getProjects()方法来获取项目列表。方法必须使用 @Transient 进行注释,以将getProjects()方法标记为不是JPA persitent(默认情况下,实体映射中的所有属性或字段都是persitent)
@Entity
public class Employee
{
@Id
@Column(name="ID")
private long id;
...
@OneToMany...
private List<ManagerReportProject> managerReportProjects;
...
/*
YOU DON'T NEED THIS ANYMORE:
@ManyToMany
@JoinTable(
name="EMP_PROJ",
joinColumns={@JoinColumn(name="EMP_ID", referencedColumnName="ID")},
inverseJoinColumns={@JoinColumn(name="PROJ_ID", referencedColumnName="ID")})
private List<Project> projects;
*/
@Transient
public List<Project> getProjects()
{
List<Project> projects = new ArrayList<Project>();
for(ManagerReportProject managerReportProject: managerReportProjects)
{
projects.add(managerReportProject.getProject());
}
return projects;
}
...
}
ManagerReportProject 应指向员工,项目和经理实体 @ManyToOne 协会。
将经理报告特定列放入ManagerReportProject (开始日期,结束日期,性能等)。
ManagerReportProject使用 @Table 注释映射到 EMP_PROJ 表。
@Entity
@Table(name= "EMP_PROJ")
public class ManagerReportProject{
@Id
@Column(name="ID")
private long id;
//manager report columns
private Date startDate;
private Date endDate;
performance, etc.
@ManyToOne...
private Manager manager;
...
@ManyToOne...
private Employee employee;
@ManyToOne...
private Project project;
...
}
创建经理实体,使用 @OneToMany 将集合映射到 ManagerReportProject 实体:
@Entity
public class Manager {
@Id
@Column(name="ID")
private long id;
...
@OneToMany...
private List<ManagerReportProject> managerReportProjects;
...
}
现在,您可以输入有关员工每个项目的具体信息,例如开始日期,结束日期,绩效等。 这是一个草图,仅用于演示如何编辑为特定经理工作的特定雇主的现有经理报告:
Emyployee employee = ...
Manager manager = ...
List<ManagerReportProject> managerReportProjects= employee.getManagerReportProjects()
for(ManagerReportProject managerReportProject: managerReportProjects )
{
if(manager.equals(managerReportProject.getManager()))
{
Project project = managerReportProject.getProject();
managerReportProject.setStartDate(...);
managerReportProject.setEndDate(...);
managerReportProject.setperformance(...);
...
}
}