@OneToMany的映射与mappedBy中的多个键的关系

时间:2014-06-24 11:51:44

标签: java java-ee jpa ejb ejb-3.0

在我的项目中,我想在mappedBy属性中使用@OneToMany与多个键的关系。

在我的项目中,我有 IncidentReport 实体和 ReportEntry 实体,以下映射是直截了当的

@Entity
public class ReportEntry {

...
    @JoinColumn(name = "incident_report", referencedColumnName = "id")
    @ManyToOne
    private IncidentReport incidentReport;

    private int type; // 0,1,2

    ...
} 


@Entity
public class IncidentReport {
    ...    

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "incidentReport")
    private Collection<ReportEntry> reportEntryCollection;


    ...    
}

但理想情况下,我希望 IncidentReport 类中的 ReportEntry 有3个不同的集合(每种类型的报告条目一个)。

有没有办法根据2个键映射集合,例如 incidentReport 类型的值?

这样的事情:

@Entity
public class IncidentReport {
    ...    

    // Type 0
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "incidentReport", 
                                          mappedBy = "type = 0" )
    private Collection<ReportEntry> reportEntryCollection1;

    // Type 1
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "incidentReport" 
                                          mappedBy = "type = 1" )
    private Collection<ReportEntry> reportEntryCollection1;

    // Type 2
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "incidentReport" 
                                          mappedBy = "type = 2" )
    private Collection<ReportEntry> reportEntryCollection1;


    ...    
}

有办法吗?我的计划是添加另一个实体来分别映射它们。这样做真的很糟糕吗?

1 个答案:

答案 0 :(得分:0)

因为有类型参数,我建议您根据该参数定义3个不同的实体

@Entity
public class Type1ReportEntry extends ReportEntry{}

@Entity
public class Type2ReportEntry extends ReportEntry{}

@Entity
public class Type3ReportEntry extends ReportEntry{}

因为就@OneToMany映射而言,你无法达到你想要的效果。

您不需要定义任何命名查询:

假设您已将EntityManager资源注入会话bean,或者从EntityManagerFactory

创建它
 public ReportEntry getReportEntry(Class<? extends ReportEntry> reportType){
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().
            createQuery();
    cq.select(cq.from(reportType));
    return getEntityManager().createQuery(cq).getResultList();
  }