gpt4 book ai didi

java - 线程安全的 Spring 数据删除

转载 作者:行者123 更新时间:2023-12-01 06:21:42 26 4
gpt4 key购买 nike

我有两个具有一对一关联的实体。以及一些与它们并行工作的服务。我需要删除一个实体,但有时我会遇到 DataIntegrityViolationException,据我了解,这意味着我无法删除某些实体,而其他实体上有外键。

这是我的实体:

public class Foo{

@Id
@GeneratedValue
private Long id;

}

和:

public class Bar{

@Id
@GeneratedValue
private Long id;

@ManyToOne
private Foo foo;

}

不起作用的方法(所有存储库都从 JpaRepository 扩展):

    @Transactional
public void deleteFoo(Long fooId) {
barRepository.deleteAllByFooId(fooId);
fooRepository.deleteById(fooId);
}

还有一些并行工作并破坏一切的方法:

    @Transactional
public void method(Long fooId) {
...
Foo foo = fooRepository.findById(fooId);
barRepository.save(new Bar(foo));
...
}

所以我有 ConstraintViolationException,据我所知,因为我试图删除 Foo 但我有 new Bar(foo)method未被 barRepository.deleteAllByFooId(fooId) 删除在deleteFoo .

我需要一些方法,例如“删除方法应该等到所有当前事务完成,然后只运行一个事务”。无法使用KeyLockManager因为项目的实际结构已经足够复杂,如果我使用它,它应该在许多类中具有相同的锁。

最佳答案

问题是您尝试删除事务中正在使用的实体。要关闭事务,您可以使用存储库的 save() 方法。

您还应该看看cascadesorphan removal 。像这样使用:

Bar实体中:

@ManyToOne(cascade = CascadeType.REMOVE, orphanRemoval = true)
private Foo foo;

然后像这样删除:

barRepository.save(bar);

左右:

关于java - 线程安全的 Spring 数据删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58318047/

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