2017-08-17 85 views
0

如果我的系統有客戶,員工,時間表,並且他們都有附件與他們關聯。我不想爲每一次都創建一個附件表,我想要一個可以共享的泛型表。沒有外鍵的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會鏈接,但不會是外鍵,因爲它可以轉到許多不同的表中。

如果我想所有附件爲特定客戶我會喜歡這個

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

SQL來說,這種關係與JPA建模/休眠?

回答

1

是的,他們可以。

什麼你所描述的是使用

  • 的SINGLE_TABLE繼承策略根Attachment實體與幾個子實體(ClientAttachmentTimesheetAttachment)的映射,
  • 列類型鑑別列,
  • 值「Client」作爲ClientAttachment實體的鑑別器值,
  • 值「TIMESHEET」作爲TimesheetAttachment實體的鑑別器值。

使用REFERENCE_ID作爲連接列,所有子實體都將擁有與其擁有實體(客戶端,時間表)的ManyToOne關聯。

我寧願使用一個Attachment實體/表,沒有任何REFERENCED_ID列和幾個連接表:每個實體有一個連接表。這將更清潔:可以使用真正的外鍵,而不是將多個不同表的ID存儲在同一列中。它也將避免所有這些子類的需要。您只需在每個擁有附件的實體中都擁有與附件的OneToMany關聯。