gpt4 book ai didi

java - 保存时禁用 ManyToOne 关系 JPA 中的级联

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:17 25 4
gpt4 key购买 nike

我在数据库中保存实体时遇到问题。

我有类似的东西(非常简单):

@Entity
public class Building {

@OneToMany(mappedBy = "building", fetch = FetchType.EAGER)
private List<Employee> employees;

}

@Entity
public class Employee {

@NotNull
@ManyToOne
@JoinFetch(INNER)
@JoinColumn
private Building building;

@PostLoad
private void onLoad(){
if (this.plannedOrder == null) {
//For old entities in this DB, update plannedOrder if null
if (this.order < FIRST.getCode()) {
this.plannedOrder = FIRST;
} else if (this.order >= FIRST.getCode() && this.order < SECOND.getCode()) {
this.plannedOrder = SECOND;
} else if (this.order >= DEFAULT.getCode() && this.order < SEC_LAST.getCode()) {
this.plannedOrder = DEFAULT;
} else if (this.order >= SEC_LAST.getCode() && this.order < LAST.getCode()) {
this.plannedOrder = SEC_LAST;
} else if (this.order >= LAST.getCode()) {
this.plannedOrder = LAST;
} else {
this.plannedOrder = DEFAULT;
}
}

}

问题是当我保存一个 Employee 实体时。在 Building 实体中,您将修改所有员工,因为 @PostLoad 注释,因此 JPA 将尝试更新这些实体。但是,我只想更新 Employee 实体。

有没有什么方法可以在不改变模型关系的情况下做到这一点?可以是删除 onLoad 函数的解决方案吗?

谢谢!

已编辑:

增加了PostLoad的PostLoad代码。这是为数据库中的旧实体执行的修复,保存时没有更新此字段。

已编辑 2

这就是我用我的 EntityManager 保存我的实体 Employee 的方式(如果是一个新对象,坚持,否则更新它)

    if (entity.getId() == null) {
entityManager.persist(entity);
return entity;
}
return entityManager.merge(entity);

最佳答案

只是扩展了 Tobb 的回答:发生这种情况是因为您正在使用合并调用加载 Employee 。该实体与默认为 Eagerly fetched 的建筑物具有 1:1 的关系,强制建筑物也被加载。

Building 也有一个 1:M 到 Employees,你用 fetch = FetchType.EAGER 标记了它,强制所有员工也被加载。

如果您不希望加载所有员工,从而强制 JPA 调用他们的 postLoad 方法,则需要防止加载这些关系中的一个或多个。选项:

  1. 将一个或多个标记为 fetch = FetchType.LAZY
    • 这对于集合来说是微不足道的,但是 1:1 映射可能需要额外的支持。例如 EclipseLink 需要编织
  2. 从实体中删除一个或多个映射。
  3. 删除更改实体的 postLoad 逻辑。这似乎不是操纵实体的最佳位置,因为即使事务中可能没有其他更改,对它们的任何访问都会强制更新。您可能想出一种不同的策略,例如一次性批量更新遗留数据,而不是长期影响您的应用程序的策略。如果必须,可以改用@PreUpdate

如果您选择使用延迟抓取,这仍然可以根据需要通过抓取连接、查询提示和/或抓取/加载组在逐个查询的基础上被覆盖。

关于java - 保存时禁用 ManyToOne 关系 JPA 中的级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34897343/

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