多对多关系 (@JoinTable) 中的拥有实体和非拥有实体有啥区别?
Posted
技术标签:
【中文标题】多对多关系 (@JoinTable) 中的拥有实体和非拥有实体有啥区别?【英文标题】:What is the difference between the owning entity and non-owning entity in a ManyToMany relationship (@JoinTable)?多对多关系 (@JoinTable) 中的拥有实体和非拥有实体有什么区别? 【发布时间】:2014-08-26 20:58:16 【问题描述】:我有两个实体:Apikey 和 Api。这些是使用连接表连接的:
CREATE TABLE ACTIVE_APIS(
API_ID INTEGER NOT NULL,
API_KEY_ID INTEGER NOT NULL,
CONSTRAINT PK_API_ID_API_KEY_ID PRIMARY KEY (API_ID, API_KEY_ID),
CONSTRAINT FK_API_ID FOREIGN KEY (API_ID) REFERENCES APIS (API_ID),
CONSTRAINT FK_API_KEY_ID FOREIGN KEY (API_KEY_ID) REFERENCES API_KEYS (API_KEY_ID)
);
这之间的行为区别是什么(在 Apikey.class 中):
@ManyToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@JoinTable(name="ACTIVE_APIS",
joinColumns=
@JoinColumn(name="API_KEY_ID", referencedColumnName="API_KEY_ID")
,
inverseJoinColumns=
@JoinColumn(name="API_ID", referencedColumnName="API_ID")
)
private List<Api> activeapis;
还有这个(在 Api.class 中):
@ManyToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@JoinTable(name="ACTIVE_APIS",
joinColumns=
@JoinColumn(name="API_ID", referencedColumnName="API_ID")
,
inverseJoinColumns=
@JoinColumn(name="API_KEY_ID", referencedColumnName="API_KEY_ID")
)
private List<Apikey> apikeys
我怀疑这与删除有关,但文档什么也没说:http://docs.oracle.com/javaee/7/api/javax/persistence/JoinTable.html#joinColumns()。
【问题讨论】:
【参考方案1】:没有行为差异。
由于任何一个实体表中都没有连接列,因此无法确定关系的拥有/反向。相反,每一方都可以同时被视为拥有方和反方。
注释的放置位置是一个选择问题,只是不要将它们放在两边 - 如果您依赖默认命名约定,mappedBy
属性也同样有效。
【讨论】:
以上是关于多对多关系 (@JoinTable) 中的拥有实体和非拥有实体有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
JPA - 一个实体如何引用多对多关系中涉及的两个其他实体?