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

时间:2010-01-19 18:31:17

标签: java hibernate orm jpa one-to-many

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

3 个答案:

答案 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(仅限OneToOneManyToOne或{ {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。