我已经搜索了很多其他SO问题而没有运气,可能是因为我使用了不正确的搜索字词。
我想创建一个实体(注释),可以"附加"到我们的继承树中的任何其他实体。
例如:
@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 :(得分: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。
顺便说一下,请记住只保存coupleItem_ID,relatedItem_DTYPE意味着一个音符只能属于特定类型的一个实例。