Spring 如何在新事务中保存实体?

Spring 如何在新事务中保存实体?,spring,jpa,spring-data-jpa,spring-data,Spring,Jpa,Spring Data Jpa,Spring Data,我有一个方法,它调用另一个方法来用新事务保存实体对象 public class FooProcessor { @Transactional public Foo process(final String id, final String name, final String description) { final Foo foo = this.fooCreator.createFoo(id, name, description); foo.set

我有一个方法,它调用另一个方法来用新事务保存实体对象

public class FooProcessor {
    @Transactional
    public Foo process(final String id, final String name, final String description) {
        final Foo foo = this.fooCreator.createFoo(id, name, description);
        foo.setDescription("Change description");
        this.fooDAO.save(foo);
        return foo;
    }
}
process()正在调用FooCreator类中的createFoo()方法,以使用@Transactional(propagation=propagation.REQUIRES_NEW)创建foo对象

在process方法中修改返回的foo对象时,它将另存为新对象。如何修改createFoo()返回的现有foo对象

如果我尝试findById,它仍会引发异常

public class FooProcessor {
 @Transactional
    public Foo process(final String id, final String name, final String description) {
        final Foo foo = this.fooCreator.createFoo(id, name, description);
        final Foo newFoo = fooDAO.findById(foo.getId())
                .orElseThrow(() -> new NotFoundException("Foo not found"));
        newFoo.setDescription("Change description");
        this.fooDAO.save(newFoo);
        return newFoo;
    }
}

如何在新事务中保存实体并在调用方方法中使用相同的实体?

如果没有使用适当的隔离级别,则您的方法应该无法读取新事务中的更改。如果将隔离级别设置为
READ\u committed
,则流程方法可以读取创建者方法的更改

@Transaction(isolation = Isolation.READ_COMMITTED)
public Foo process(final String id, final String name, final String description) {
}

如果您有更严格的隔离级别,则事务可能无法使用所需的新事务读取方法中所做的更改。举个例子,如果您设置了更严格的Isolation.SERIALIZABLE,您的代码将给出一个
NotFoundException
,因为在creator方法中所做的更改无法在process方法的事务中读取。

您是在process方法中得到了
NotFoundException
还是得到了不同的异常?我已尝试重现您的问题,实体将在
createFoo
方法中的新事务中持久化,并可在流程方法correcty中找到。我在流程方法中得到NotFoundException。createFoo正在成功持久化。
@Transaction(isolation = Isolation.READ_COMMITTED)
public Foo process(final String id, final String name, final String description) {
}