在单独的实体中使用连接表

时间:2013-09-17 20:10:45

标签: java hibernate openxava

我有一个与连接表建立的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;
  ...
}

1 个答案:

答案 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(...);
       ...

    }

}