gpt4 book ai didi

java - JPA:映射交叉的 OneToOne 和 ManyToOne 关系

转载 作者:行者123 更新时间:2023-12-01 17:28:51 24 4
gpt4 key购买 nike

我有两个实体,我们将其称为 A 和 B。B 始终将 A 作为具有 ManyToOne 关系的父实体。但是,我需要 A 与表 B 中插入的最新记录具有 OneToOne 关系。这是因为我需要保存 B 的多个版本,但 99% 的时间只需要使用最新的版本。

这看起来像这样:

@Data
@Entity
public class A {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Setter(AccessLevel.NONE)
private Long id;

/* Properties
...
*/

@OneToOne(optional = false)
private B latest;
}
@Data
@Entity
public class B {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Setter(AccessLevel.NONE)
private Long id;

/* Properties
...
*/

@Column(nullable = false)
private Date lastModified;

@ManyToOne(optional = false)
private A parent;
}

现在,手头的问题是我似乎无法持久保存这些实体,因为它们似乎总是短暂的:

  • A 无法持久化,因为 latest 引用了 B,但 B 并未持久化。
  • B 无法持久化,因为 parent 引用了 A,但 A 并未持久化。

尝试这样做会导致:

java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation : B.parent -> A

我尝试将负责将它们保留在 @Transactional 方法中的代码包装起来,但同样的情况发生了:

@Transactional
public void saveAB(A parent, B child) {
parent.setLatest(child);
child.setParent(parent);
Arepository.save(parent);
Brepository.save(child);
}

我还考虑过忽略从 A 到 B 的 OneToOne 关系,而是将 latest 作为 transient @Formula 字段,该字段将查询 B 以获取最新记录。但是,@Formula 似乎仅限于基元,而不是完整的实体。

使用 JPA 执行此操作的正确方法是什么?我是否以错误的方式处理这个问题?

最佳答案

由于 AB 相互依赖,因此它们可能应该被视为单个 aggregate其中 A 是聚合根。

这意味着您在关系上只有一个 ARepositoryCascadeType.ALL

关于java - JPA:映射交叉的 OneToOne 和 ManyToOne 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61164395/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com