java - 为同一实体上的 oneToMany 映射设计 JPA 实体对象

标签 java hibernate jpa one-to-many

如果我们有一个表说 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/

相关文章:

java - Java中的递归排列产生错误的结果

java - Spring Boot XML 更改根元素名称

mysql - Liquibase Hibernate diff 异常

hibernate 空间 : can't find function

java - 配置 Jedis 超时

java - Hibernate @ManyToMany -- 未填充连接表

sql - JPA 多重计数

java - 传递给持久化的 Hibernate 分离实体

java - 将 SQL Left Join 查询转换为 EclipseLink JPA 查询

java - 多线程服务器客户端地址已被使用