如果我的系统有客户,员工,时间表,并且他们都有与之相关的附件。我不想每次创建一个附件表,而是希望共享一个通用表。
| 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建模吗?
答案 0 :(得分:1)
是的,他们可以。
您所描述的是使用
的多个子实体(Attachment
,ClientAttachment
)的根TimesheetAttachment
实体的映射
所有子实体都与其拥有实体(客户端,时间表)具有ManyToOne关联,使用REFERENCE_ID作为连接列。
我宁愿使用一个Attachment实体/表,没有任何REFERENCED_ID列,还有几个连接表:每个实体都有一个连接表。这将更清晰:可以使用真正的外键,而不是将多个不同表的ID存储在同一列中。它还可以避免使用所有这些子类。在具有附件的每个实体中,您只需要与附件的OneToMany关联。