JPA处理没有外键的关系

时间:2017-08-17 15:14:54

标签: java hibernate jpa

如果我的系统有客户,员工,时间表,并且他们都有与之相关的附件。我不想每次创建一个附件表,而是希望共享一个通用表。

|  ID  |  TYPE      |  FILE_LOCATION  |  FILE_TYPE  | REFERENCED_ID |
|  1   | CLIENT     | C:\temp1.pdf    | PDF         |       22      |
|  2   | TIMESHEET  | C:\temp2.pdf    | PDF         |       342     |

在这种情况下,reference_id会链接但不会是外键,因为它可能会转到许多不同的表。

如果我想要特定客户端的所有附件,我会像这样使用SQL

SELECT * FROM ATTACHMENT WHERE TYPE = 'CLIENT' AND REFERENCE_ID = 22;

这种关系可以用JPA / Hibernate建模吗?

1 个答案:

答案 0 :(得分:1)

是的,他们可以。

您所描述的是使用

的多个子实体(AttachmentClientAttachment)的根TimesheetAttachment实体的映射
  • SINGLE_TABLE继承策略,
  • 列TYPE作为鉴别列,
  • 值“CLIENT”作为ClientAttachment实体的鉴别值,
  • 值“TIMESHEET”作为TimesheetAttachment实体的鉴别值。

所有子实体都与其拥有实体(客户端,时间表)具有ManyToOne关联,使用REFERENCE_ID作为连接列。

我宁愿使用一个Attachment实体/表,没有任何REFERENCED_ID列,还有几个连接表:每个实体都有一个连接表。这将更清晰:可以使用真正的外键,而不是将多个不同表的ID存储在同一列中。它还可以避免使用所有这些子类。在具有附件的每个实体中,您只需要与附件的OneToMany关联。