【问题标题】:JPA Annotations for Multiple One-to-One Self-Referential Relations多个一对一自引用关系的 JPA 注释
【发布时间】:2020-06-16 10:02:46
【问题描述】:

我正在尝试为具有对上一个任务的引用和对下一个任务的引用的任务对象定义模型。这就是我尝试在我的CompletableTask.java 类中为这些关系建模的方式:

@OneToOne(mappedBy = "previousTask", orphanRemoval = true)
@JoinColumn(name = "next_task_id")
private CompletableTask nextTask;

@OneToOne(mappedBy = "nextTask", orphanRemoval = true)
@JoinColumn(name = "previous_task_id")
private CompletableTask previousTask;

但是,当我启动我的应用程序并让 Hibernate 为此创建必要的架构更新时,我收到以下错误日志:

org.hibernate.AnnotationException: Unknown mappedBy in: com.my_package.CompletableTask.nextTask, referenced property unknown: com.my_package.CompletableTask.previousTask

我已经能够通过简单地从 nextTask 的一对一注释中删除 mappedBy = "previousTask" 参数来解决这个问题,但是在 Hibernate 生成的表中不存在 previous_task_id,我认为不符合我的预期目的。

有人可以解释一下我将如何进行建模吗?如果无法实现同时引用下一个和上一个任务的所需架构,我的替代方案是什么?

【问题讨论】:

  • 我建议一个任务只存储一个关系,例如nextTask。如果两个关系都存储在每个任务中,则两行必须保存相同的关系(一个任务保存nextTask 关系,另一个保存previousTask 关系,都引用另一个任务)。如果关系存储在多个实体中,我不确定 hibernate 是否能够处理数据一致性。

标签: java hibernate jpa spring-data-jpa one-to-one


【解决方案1】:

mappedBy 表示在双向关系中“拥有”关系的属性。 因此,两边都有mappedBy 是没有意义的。 请删除一个。

【讨论】:

  • 是的,你是对的。这是不允许这样做的结构性原因,但@Turing85 指出,除此之外,我的设计存在缺陷。对于这个应用程序,我本质上是在对一个双向链表进行建模,其中包含不需要持久保存即可知道完整状态的冗余数据。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
相关资源
最近更新 更多