【问题标题】:JPA validation - OneToOne to same tableJPA 验证 - OneToOne 到同一张表
【发布时间】:2014-05-23 05:27:17
【问题描述】:

我刚刚在 eclipse 中启用了 JPA 验证并显示了一些错误(代码实际上运行良好)。

我有一个文章实体,它包含对下一篇文章和上一个实体(相同类型)的引用。验证器抱怨消息:

Column "nextArticle" cannot be resolved on table "article"

这到底是什么意思? SQL 表也有列。我还尝试使用“mappedBy”和“JoinColumn”注释将变量相互映射,但无法解决验证错误。

这是类和验证错误:

这就是映射:

编辑:尝试了anttix的建议:表中的列被命名为“nextArticle_id”和“prevArticle_id”,所以我想出了那个代码:

@OneToOne(mappedBy = "prevArticle")
@JoinColumn(name = "nextArticle_id")
public Article getNextArticle() {
    return nextArticle;
}

@OneToOne(mappedBy = "nextArticle")
@JoinColumn(name = "prevArticle_id")
public Article getPrevArticle() {
    return prevArticle;
}

但验证器现在抱怨带有消息的“mappedBy”注释:

In attribute 'prevArticle', the "mapped by" attribute 'nextArticle' has an invalid mapping type for this relationship.

编辑 2: 我找到了解决方案。我必须使用 @Column 注释告诉验证器实际数据库中列的名称,如下所示:

【问题讨论】:

  • 从“真实”列支持的关系中删除 mappedBy。但是实际上不需要两个外键列来实现关系。请通过 wikibooks 链接工作,它详细解释了这些关系是如何工作的。

标签: java eclipse hibernate validation jpa


【解决方案1】:

Eclipse 在表中找不到名为prevArticle 的列。您应该为 nextArticle 指定列名并创建与 prevArticle 的双向关系以表明它不需要自己的外键列。

@OneToOne
@JoinColumn(name = "next_id")
private Article nextArticle;

@OneToOne(mappedBy = "nextArticle")
private Article prevArticle;

您可以根据需要从nextArticle 中省略@JoinColumn,但我会保留它以明确哪个关系“拥有”外键列。

另见:

【讨论】:

  • 我试过了,但它并没有真正起作用 -> 用结果更新了我的帖子
  • 你没有注意这个例子。与 @JoinColumn 的关系上没有 mappedBy 属性
  • 如果我使用你的例子,它是一样的,但我想,我需要双向映射
猜你喜欢
  • 1970-01-01
  • 2014-01-18
  • 2010-12-12
  • 2016-01-17
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
相关资源
最近更新 更多