【问题标题】:PersistenceException - org.hibernate.exception.ConstraintViolationException is thrown when multiple @OneToMany relations with the same entityPersistenceException - org.hibernate.exception.ConstraintViolationException 当多个 @OneToMany 关系与同一个实体时抛出
【发布时间】:2020-01-25 12:08:30
【问题描述】:

在我的应用程序中,当我在一个类中包含 2 个或多个相同实体(@OneToMany 关系)的列表时,我得到 org.hibernate.exception.ConstraintViolationException。

    @Embeddable
    data class DocPresentation(

            @OneToMany(cascade = [CascadeType.ALL])
            var billOfLadingComments: List<Comment>?,


            @OneToMany(cascade = [CascadeType.ALL])
            var invoiceComments: List<Comment>?,

            ...

    @Entity
    @Table(name = "Comment")
    data class Comment(

            @Column(name = "date")
            var date: Date?,

            @Column(name = "message")
            var message: String?,

            @Embedded
            var sender: Company?

    ) {
        constructor() : this(null, null, null)

        @Id
        @GeneratedValue
        @Column(name = "database_id")
        var databaseId: Int? = null
    }

关系是单向的,因此会创建一个中间表来保存相关实体的 ID。在这种情况下,它包括 DocPresentation 的嵌入实体的 id,以及 2 个列:billOfLadingComments_database_idinvoiceComments_database_id。 当我评论其中一个列表时,应用程序可以正常工作。如何解决异常?

【问题讨论】:

  • 你有没有试过通过JoinTable注解来配置这两个关系?看->stackoverflow.com/questions/5478328/jpa-jointable-annotation.
  • 您是否使用一个通用的 JoinTable 进行 2 个 OneToMany 映射?
  • @oputyk 该帖子有帮助,由于您提供的链接,我已经解决了错误。请将评论发布为答案,以便我对其进行评分并标记为最佳答案。
  • @Martin'sRun,是的,我这样做了。现在我为每个列表使用不同的 JoinTables。感谢您的评论。

标签: java hibernate jpa corda


【解决方案1】:

我就是这样解决的。我使用 2 个 Join 列,因为嵌入实体中有 2 个 ID。

@ElementCollection
            @CollectionTable(
                    name = "docs_presentation_bill_of_lading_hashes",
                    joinColumns = [
                        JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"),
                        JoinColumn(name = "output_index", referencedColumnName = "output_index")
                    ]
            )
            @Column(name = "bill_of_lading_hash")
            var billOfLading: List<String>? = null,

            @OneToMany(cascade = [CascadeType.ALL])
            @JoinTable(
                    name = "doc_presentation_bill_of_lading_comments",
                    inverseJoinColumns = [
                        JoinColumn(name = "bill_of_lading_comment_id", referencedColumnName = "database_id")
                    ]
            )
            var billOfLadingComments: List<Comment>? = null,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2020-12-04
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多