@OneToMany没有反向关系,没有连接表?

jsi*_*ght 34 java orm hibernate jpa one-to-many

这与"没有单独的连接表的Hibernate @OneToMany"类似,我需要一个没有连接表的@OneToMany关系.但是,我还想不定义反比关系.删除反转似乎会导致自动生成连接表...是否有解决方法?

Art*_*ald 52

在JPA 2.0+中,您可以使用@JoinColumn作为避免生成连接表的方法.

试试吧.

@OneToMany
@JoinColumn(name="COLUMN_NAME")
Run Code Online (Sandbox Code Playgroud)

UPDATE

上面提供的信息是从EJB 3.0 o'reilly book中提取的(查找@JoinColumn注释引用了PHONE表中的CUSTOMER_ID列).但是,普通的JPA 1.0规范不支持此功能.它说的是什么

可以使用一对多外键映射来实现单向一对多关系,但是,此版本中不需要此类支持.想要对一对多关系使用外键映射策略的应用程序应该使这些关系成为双向的,以确保可移植性

因此在1.0中它是特定于供应商的实现(并且它是有道理的,作者在JBoss工作 - 休眠后面的红帽分区)

它得到了JPA 2.0实现的支持

如果连接是使用外键映射策略进行单向OneToMany映射,则外键位于目标实体的表中.


Pas*_*ent 16

在JPA 1.0规范并NOT支持单向一对多映射没有加入表.

并且在标准 JPA 1.0中不允许使用JoinColumnon a (仅限a ,或).虽然它在JPA 2.0中.OneToManyOneToOneManyToOneManyToMany

从JPA 1.0规范:

2.1.8.5.1单向OneToMany关系

以下映射默认值适用:

实体A映射到名为的表 A.实体B映射到名为的表B.有一个名为A_B(所有者名称优先)的连接表.此连接表有两个外键列.一个外键列引用表,A并且具有与表的主键相同的类型 A.此外键列的名称形成为以下内容的串联:实体A的名称; "_"; 表中主键列的名称A.另一个外键列是指表B,其类型与表的主键相同B并且有一个独特的关键约束.此外键列的名称形成为以下内容的串联:关系属性的名称或实体A的字段; "_"; 表中主键列的名称B.

总而言之,如果您不想要连接表(以及完整的读/写支持)并且仍然希望与JPA兼容,请使关联双向(带有inverse一侧).

下面的wiki book链接讨论了一个技巧(将目标表映射为连接表)以"解决"问题,但这仅适用于读取,写入不起作用.

参考