【问题标题】:Constraint violation with @OrderColumn in @ManyToMany在@ManyToMany 中使用@OrderColumn 违反约束
【发布时间】:2017-01-29 19:57:39
【问题描述】:

我违反了连接表的主键约束,它是由 EclipseLink 为以下类自动创建的:

@Entity public class Link {
    @ManyToMany @OrderColumn
    private List<Node> nodes; ...

@Entity public class Node {
    @ManyToMany(fetch = FetchType.EAGER, mappedBy = "nodes") 
    private List<Link> links; ...

如果我在其节点的第一个和第二个位置插入具有相同节点的链接,则会发生违规。确实有一个带有 NODES_ID 和 LINKS_ID 的生成索引(缺少 NODES_ORDER)。我如何影响 EclipseLink 或其他提供者以省略或扩展此约束?

使用:Glassfish 4.1.1、EclipseLink 2.6.4 或 2.7.0(交叉发布)、Java 8

【问题讨论】:

  • 你在哪里定义你的连接表?一个带有 ddl 表的小 sql 也会很有用
  • 使用 JPA(约定优于配置)我不需要定义它。连接表 LINK_NODES 是在启动时自动创建的,但带有上述不需要的约束。
  • 这可以通过将 javax.persistence.schema-generation.database.action 设置为 persistence.xml 中的 create-or-extend-tables 来实现。
  • 发布连接表的 DDL?插入连接表的 SQL 在哪里?该列表是有序列表还是索引列表?
  • EclipseLink 不支持集合中的重复项。您可以尝试手动删除生成的 DDL 中的约束,然后从那时起使用脚本,但可能还有其他问题 - 请务必测试它是否适合您。

标签: jpa java-8 many-to-many eclipselink


【解决方案1】:

尝试添加这个:

@org.hibernate.annotations.ForeignKey( name = "none") 

在映射的两边。

【讨论】:

  • 感谢您的想法!由于我使用的是 EclipseLink/JPA,因此没有可用的 Hibernate 注释。然而,自 JPA 2.1 以来,有一个已弃用的 @javax.persistence.ForeignKey 注释,不能在那里应用。因此,解决方案可能类似于使用 \@JoinColumn 或 \@JoinTable。
  • @JoinColumn(foreignKey=@ForeignKey(ConstraintMode.NO_CONSTRAINT)) 不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
相关资源
最近更新 更多