JPA:许多其他实体类使用的公共实体
问题描述:
我已经搜索了很多其他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
想法?
答
这取决于你有多少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意味着一个笔记可以只属于一个特定类型的实例。
我认为这里有一个问题。如果我理解正确,你希望在其他表格中附上注释。然后,您想要为所有表重用笔记。我相信,并纠正我,如果我错了,EntityOne笔记与EntityTwo ntoes不同,这意味着它们应该存储在不同的表中。在另一种情况下,您可以将EntityOne和EntityTwo与本例中的User表关联(例如),但用户无处不在,但一张表的备注与另一个表的备注不同,因为它们具有相同的结构。 – Desorder 2014-09-30 01:06:46
我不确定他们是不同的。以Post-it为例。所有的帖子都是一样的,除了写在它们上面的东西外。邮政可以卡住任何东西。这实质上就是我想要的模型 – kabal 2014-09-30 07:59:41
那么,建模时没有对或错。我的用户示例遵循您的建模思路。我相信笔记模型也会起作用。如果有更多桌子加入派对,并且需要将更多笔记附加到这些新桌子,我会担心。您可能需要在一个表格中记录笔记的额外信息。然后你会添加一个额外的列,其他笔记不需要打破上帝知道的规范化规则号码。我对你的要求一无所知,我可能只是在这里讨论。 :) – Desorder 2014-09-30 09:27:09