【问题标题】:@OneToMany without inverse relationship and without a join table?@OneToMany 没有反向关系且没有连接表?
【发布时间】:2011-01-06 22:46:38
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    在 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 规范所不允许的,这是 Hibernate 特有的。
    • @Pascal Thivent 我同意 JPA 规范。创建连接表是有意义的。它避免了像这里显示的问题(是的,最喜欢的星已经被我标记了):stackoverflow.com/questions/1275481/… 但是提供的信息已经收集在 EJB 3.0 o reilly 中查找 @JoinColumn 注释引用了 CUSTOMER_ID 列PHONE 表 因为作者为 JBoss 工作,所以你看到这样的东西是有道理的
    • 好消息是所有这些都在 JPA 2.0 中“修复”了。但是您也许可以在回答中澄清这适用于 Hibernate(但不是标准的 JPA 1.0)。然后我可以投票:)
    【解决方案2】:

    JPA 1.0 规范支持单向 OneToMany 映射没有连接表

    标准 JPA 1.0 中不允许在OneToMany 上使用JoinColumn(仅在OneToOneManyToOneManyToMany 上)。不过它在 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 书籍链接讨论了一个“解决”问题的技巧(将目标表映射为连接表),但这仅适用于读取,写入不起作用。

    参考文献

    【讨论】:

    • @Arthur 你好,亚瑟!你也有我的投票,你的回答在 OP 的背景下很好。我的回答只针对对 JPA 1.0 对此有何看法感兴趣的读者。
    【解决方案3】:

    如果数据库中没有连接表,那么数据库中两个表之间的关系将通过外键引用主键来实现。 如果关系是通过 PK/FK 实现的,则目标类中必须有一个属性引用回源,以便用值填充 FK 列。目标类中的此属性可以是 id 或源对象。 如果它是一个源对象,那么你需要在目标类中有一个逆 @ManyToOne。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2012-05-19
      • 1970-01-01
      相关资源
      最近更新 更多