这与"Hibernate @OneToMany without a separate join table"的问题类似,因为我需要一个没有连接表的 @OneToMany 关系。但是,我也不想定义反比关系。删除逆似乎会导致自动生成连接表......是否有解决方法?
3 回答
在 JPA 2.0+ 中,您可以使用 @JoinColumn 作为一种避免生成连接表的方法。
试试看。
@OneToMany
@JoinColumn(name="COLUMN_NAME")
更新
上面提供的信息是从 EJB 3.0 o'reilly 书中提取的(查找 @JoinColumn 注释引用 PHONE 表中的 CUSTOMER_ID 列)。但是,普通的 JPA 1.0 规范不支持此功能。它说的是
可以使用一对多外键映射来实现单向一对多关系,但是,此版本中不需要这种支持。想要对一对多关系使用外键映射策略的应用程序应该使这些关系双向以确保可移植性
所以在 1.0 中它是一个特定于供应商的实现(这是有道理的,作者在 JBoss 工作 - hibernate 背后的红帽部门)
但它受到 JPA 2.0 实现的支持
如果连接是针对使用外键映射策略的单向 OneToMany 映射,则外键在目标实体的表中。
JPA 1.0 规范不支持没有 Join Table 的单向 OneToMany 映射。
并且在标准JPA 1.0中不允许在aJoinColumn
上使用 a (仅在 a或上)。虽然它在 JPA 2.0 中。OneToMany
OneToOne
ManyToOne
ManyToMany
从 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 书籍链接讨论了一个技巧(将目标表映射为连接表)来“解决”问题,但这仅适用于读取,写入不起作用。
参考
- JPA 1.0 规范
- 2.1.8.2 双向多对一/一对多关系
- 2.1.8.5.1 单向 OneToMany 关系
- 9.1.6 JoinColumn Annotation (讨论可以在哪些上下文中使用此注释)
- JPA 维基书
如果数据库中没有连接表,那么数据库中两个表之间的关系将通过外键引用主键来实现。如果关系是通过 PK/FK 实现的,则目标类中必须有一个属性引用回源,以便用值填充 FK 列。目标类中的此属性可以是 id 或源对象。如果它是源对象,那么您需要在目标类中有一个逆 @ManyToOne。