在我的项目中,我想在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;
...
}
有办法吗?我的计划是添加另一个实体来分别映射它们。这样做真的很糟糕吗?
答案 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();
}