如果我们有一个表说 EMP_CONTACTTYPE 如下所示
EMP EMPNAME CONTACTTYPE CONTACT
1 W 1 EMAIL
2 X 1 EMAIL
3 Y 2 PHONE
4 Z 2 PHONE
如果我们想将详细信息显示为
EMAIL PHONE
W Y
X z
我们应该如何设计实体对象作为其到同一个表“EMP_CONTACTTYPE”的映射。
我创建了两个实体对象,一个用于 Contact,一个用于 Emp,如下所示,并且在 Contact 实体上获得了一个单一映射
下面是联系实体
@Entity
@Table(name = "EMP_CONTACTTYPE")
public class CONTACT
{
private String CONTACT_TYPE;
private String CONTACT;
@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name = "EMP_CONTACTTYPE", joinColumns = { xxxxxx })
private List<EMP> EMP;
}
下面是EMP实体
@Entity
@Table(name = "EMP_CONTACTTYPE")
public class EMP
{
private String EMPLOYEE_NAME;
private String EMPLOYEE_KEY;
}
预期的结果类似于联系人对象类型(1 和电子邮件)我们需要两个员工对象(W 和 X)。我不确定加入是否是解决此问题的方法,或者不清楚如何为此添加加入。设计此场景的任何建议。
最佳答案
您可以将两个实体类组合成一个实体类或使用两个表。
但是,您最好将其拆分为两个表并在两个表之间创建适当的关系。当前的模式设计不是最优的。
无论如何,根据您的情况和您的评论,由于您有一个包含所有这些数据的表,您可以从 CONTACT
扩展 EMP
类类并创建鉴别器列。使用这种方法,您会发现以下类注释很有用:
例如
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "columnname", discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue(value = "value")
您应该研究这些注释并选择适当的策略等。这应该会让您走上正确的道路。
如果您在 Hibernate 中使用鉴别器,您还可以选择指定一个公式 例如
<discriminator formula="case when CLASS_TYPE in ('a', 'b', 'c') then 0 else 1 end" type="integer"/>
关于java - 为同一实体上的 oneToMany 映射设计 JPA 实体对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19945155/