gpt4 book ai didi

spring-boot - 循环遍历 jpa streamresult 的项目并调用更新服务。 Envers 对所有项目创建修订,而不是为每个项目创建修订

转载 作者:行者123 更新时间:2023-12-04 01:03:23 24 4
gpt4 key购买 nike

我遍历 jpa streamresult 的个人实体,并为每个人调用一个更新服务 bean 来更新个人实体的名称。我明白,envers 是在交易结束时执行的。好的,这工作正常,所有实体都已更新并有一个 AUD 表条目,但所有实体都只有一个修订版。

我如何告诉 spring 为每个人实体执行一个事务,以便 envers 为每个更新的实体写入一个更新修订而不是为所有更新的个人实体?我还尝试将 @Transactional(propagation = Propagation.REQUIRES_NEW) 放在更新服务类的顶部,但并不是每个项目都会触发 envers。似乎所有更新都在一个事务中执行,但我需要为更新服务 bean 的每次调用执行一个事务。

流媒体服务:

@Service
class StreamService {

@Autowired
PersonRepository repo;

@Autowired
FooService fooService;

@Transactional
public void uppercaseAllNames() {
Stream<Person> stream = repo.findAllPersons();

// change name for each person
stream.forEach(fooService::doFoo);
}

}

简化的更新服务:

@Service
@Transactional(propagation = Propagation.REQUIRES_NEW) // <=== create new transaction
class FooService {

@Autowired
PersonRepository repo;

doFoo(Person person) {
String name = person.getName();
person.setName(name.toUpperCase());
repo.save(person); // <=== save trigger envers
}
}

解决方法:保存操作触发 envers 以创建每个人实体的修订,但此解决方案仅在我们的项目中适用于 @Transactional(propagation = Propagation.REQUIRES_NEW)。单个 @Transactional 不起作用。注释可以放置在方法或类级别,展台位置工作。

最佳答案

uppercaseAllNames 中删除 @Transactional。这将为您提供读取和每次写入的单独事务。

您需要将 personRepo.save(person) 添加到 FooService.doFoo 以保留更改。

第二个更改可能对 Propagation.REQUIRES_NEW 就足够了,但我发现嵌套事务相当困惑,建议避免使用它们。

关于spring-boot - 循环遍历 jpa streamresult 的项目并调用更新服务。 Envers 对所有项目创建修订,而不是为每个项目创建修订,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67386737/

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