多对多关系 (@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 - 一个实体如何引用多对多关系中涉及的两个其他实体?

多对多查询 jpql

JPQL 多对多 Dto 选择失败

如何为连接表中的其他属性创建多对多 Hibernate 映射?

typeORM 多对多关系不同情况的处理

ejb3:用简单的主键映射多对多关系