【发布时间】:2011-01-06 22:46:38
【问题描述】:
这是与"Hibernate @OneToMany without a separate join table" 类似的问题,因为我需要一个没有连接表的@OneToMany 关系。但是,我也不想定义反比关系。删除逆似乎会导致自动生成连接表...有解决方法吗?
【问题讨论】:
标签: java hibernate orm jpa one-to-many
这是与"Hibernate @OneToMany without a separate join table" 类似的问题,因为我需要一个没有连接表的@OneToMany 关系。但是,我也不想定义反比关系。删除逆似乎会导致自动生成连接表...有解决方法吗?
【问题讨论】:
标签: java hibernate orm jpa one-to-many
在 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 规范不支持单向 OneToMany 映射没有连接表。
在标准 JPA 1.0 中不允许在OneToMany 上使用JoinColumn(仅在OneToOne、ManyToOne 或ManyToMany 上)。不过它在 JPA 2.0 中。
来自 JPA 1.0 规范:
2.1.8.5.1 单向 OneToMany 关系
以下映射默认值适用:
实体 A 映射到名为
A。实体 B 映射到表 命名为B。有一个连接表 名为A_B(所有者名称 第一的)。这个连接表有两个 外键列。一个外键 列引用表A并具有 与表的主键类型相同A。此外键的名称 列形成为串联 以下内容:实体名称 一种; "_";主键的名称 表A中的列。另一个外国 键列是指表 B 并且有 与主键相同的类型 表B并且有一个唯一的键 对其进行约束。这个名字 外键列形成为 以下内容的串联: 关系属性的名称或 实体 A 的字段; "_";的名字 表B中的主键列。
总而言之,如果您不想要一个联接表(以及完整的读/写支持)并且仍然希望符合 JPA,请使关联是双向的(带有 inverse 侧)。
下面的 wiki 书籍链接讨论了一个“解决”问题的技巧(将目标表映射为连接表),但这仅适用于读取,写入不起作用。
【讨论】:
如果数据库中没有连接表,那么数据库中两个表之间的关系将通过外键引用主键来实现。 如果关系是通过 PK/FK 实现的,则目标类中必须有一个属性引用回源,以便用值填充 FK 列。目标类中的此属性可以是 id 或源对象。 如果它是一个源对象,那么你需要在目标类中有一个逆 @ManyToOne。
【讨论】: