这与"Hibernate @OneToMany without a separate join table"的问题类似,因为我需要一个没有连接表的@OneToMany关系。但是,我还想不定义反比关系。删除反转似乎会导致自动生成连接表...是否有解决方法?
答案 0 :(得分:50)
在JPA 2.0+中,您可以使用@JoinColumn作为避免生成连接表的方法。
试试吧。
@OneToMany
@JoinColumn(name="COLUMN_NAME")
<强>更新强>
上面提供的信息摘自EJB 3.0 o'reilly book(查找@JoinColumn注释引用PHONE表中的CUSTOMER_ID列)。但是,普通的JPA 1.0规范不支持此功能。它说的是什么
可以使用一对多外键映射来实现单向一对多关系,但是,此版本中不需要此类支持。想要对一对多关系使用外键映射策略的应用程序应该使这些关系双向以确保可移植性
1.0中的是特定于供应商的实现(这是有道理的,作者在JBoss工作 - hibernate背后的红帽分区)
但它受JPA 2.0实施支持
如果连接是使用外键映射策略进行单向OneToMany映射,则外键位于目标实体的表中。
答案 1 :(得分:15)
JPA 1.0规范 NOT 支持单向OneToMany映射没有连接表。
标准 JPA 1.0中不允许在JoinColumn
上使用OneToMany
(仅限OneToOne
,ManyToOne
或{ {1}})。它虽然在JPA 2.0中。
从JPA 1.0规范:
2.1.8.5.1单向OneToMany关系
以下映射默认值适用:
实体A映射到名为的表
ManyToMany
。实体B映射到表 名为A
。有一个连接表 名为B
的名称(所有者名称 第一)。这个连接表有两个 外键列。一把外键 列指的是表A_B
并且具有 与表的主键相同的类型A
。这个外键的名称 列形成为串联 以下内容:实体名称 一个; “_”;主键的名称 表A
中的列。其他的外国人 键列是指表B并具有 与主键相同的类型 表A
并且有一个唯一的密钥 对它的约束。这个名字 外键列形成为 连接以下内容: 关系属性的名称或 实体A的领域; “_”;的名字 表B
中的主键列。
总而言之,如果您不想要连接表(以及完整的读/写支持)并且仍然希望与JPA兼容,请使关联双向(具有B
方)。
下面的wiki book链接讨论了一个技巧(将目标表映射为连接表)以“解决”问题,但这只适用于读取,写入不起作用。
答案 2 :(得分:0)
如果数据库中没有连接表,那么数据库中两个表之间的关系将通过引用主键的外键来实现。 如果关系是通过PK / FK,则目标类中必须有一个引用回源的属性,以便用一个值填充FK列。目标类中的此属性可以是id或源对象。 如果它是一个源对象,那么你需要在目标类中有一个逆@ManyToOne。