JPA:许多其他实体类使用的公共实体

时间:2014-09-29 15:40:51

标签: java hibernate jpa

我已经搜索了很多其他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

想法?

1 个答案:

答案 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意味着一个音符只能属于特定类型的一个实例。