2014-09-29 244 views
0

我已經搜索了很多其他SO問題,但沒有運氣,可能是由於我使用了不正確的搜索術語。JPA:許多其他實體類使用的公共實體

我想創建一個實體(注),它可以「附加」到繼承樹中的任何其他實體。

如:

@Entity 
class Note extends AbstractEntity { 
    String title 
    String message; 
    AbstractEntity relatedItem; 
} 

@Entity 
class EntityOne extends AbstractEntity { 
} 

@Entity 
class EntityTwo extends AbstractEntity { 
} 

我知道我可以做到以下幾點:

@Entity 
class Note extends AbstractEntity { 
    String title 
    String message; 
} 

@Entity 
class EntityOne extends AbstractEntity { 
    List<Note> notes; 
} 

@Entity 
class EntityTwo extends AbstractEntity { 
    List<Note> notes; 
} 

但隨後這會導致類似的表:

Note - ID, title, message 
EntityOne_Note - entityOne_ID, note_ID 
EntityTwo_Note - entityTwo_ID, note_ID 

,並要求我更新如果我們希望爲他們添加註釋支持,這些實體。

出於某種原因,它只是感覺更好,有一個像表:

Note - ID, title, message, relatedItem_ID, relatedItem_DTYPE 

我不介意,甚至一個額外的表:

Note - ID, title, message 
AbstractEntity_Note - relatedItem_ID, relatedItem_DTYPE, note_ID 

想法?

+0

我認爲這裏有一個問題。如果我理解正確,你希望在其他表格中附上註釋。然後,您想要爲所有表重用筆記。我相信,並糾正我,如果我錯了,EntityOne筆記與EntityTwo ntoes不同,這意味着它們應該存儲在不同的表中。在另一種情況下,您可以將EntityOne和EntityTwo與本例中的User表關聯(例如),但用戶無處不在,但一張表的備註與另一個表的備註不同,因爲它們具有相同的結構。 – Desorder 2014-09-30 01:06:46

+0

我不確定他們是不同的。以Post-it爲例。所有的帖子都是一樣的,除了寫在它們上面的東西外。郵政可以卡住任何東西。這實質上就是我想要的模型 – kabal 2014-09-30 07:59:41

+0

那麼,建模時沒有對或錯。我的用戶示例遵循您的建模思路。我相信筆記模型也會起作用。如果有更多桌子加入派對,並且需要將更多筆記附加到這些新桌子,我會擔心。您可能需要在一個表格中記錄筆記的額外信息。然後你會添加一個額外的列,其他筆記不需要打破上帝知道的規範化規則號碼。我對你的要求一無所知,我可能只是在這裏討論。 :) – Desorder 2014-09-30 09:27:09

回答

0

這取決於你有多少relatedItem_DTYPE有,如果他們幾個(例如2),可以使用的方法是這樣

@Entity 
class Note extends AbstractEntity{ 
public String title 
public String message; 
@ManyToOne 
EntityOne e1; 
@ManyToOne 
EntityTwo e2; 
} 

如果您希望在實體類票據的參考,只需添加一個字段以保留反向關係的軌跡。

你最終會像這些類:

@Entity 
public class EntityOne{ 
... 
@OneToMany(mappedBy="e1") 
public List<Note> notes; 
} 

@Entity 
public class EntityTwo{ 
... 
@OneToMany(mappedBy="e2") 
public List<Note> notes; 
} 

或者你可以嘗試創建一個使用InheritanceType.TABLE_PER_CLASS繼承和看到的Hibernate如何處理:d。 順便記住,只保存couple relatedItem_ID,relatedItem_DTYPE意味着一個筆記可以只屬於一個特定類型的實例。