2014-09-29 237 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意味着一个笔记可以只属于一个特定类型的实例。