如何在新交易中保存实体?

问题描述

我有一个方法,该方法调用一个方法来保存具有新事务的实体对象。

android:layout_weight="0.1"

process()正在FooCreator类中调用createFoo()方法,以使用@Transactional(propagation = Propagation.REQUIRES_NEW)创建foo对象。

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;
    }
}

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

如果我尝试使用findById,它仍然会引发异常。

public class FooCreator {
     @Transactional(propagation = Propagation.REQUIRES_NEW)
     public Foo createFoo(final String id,final String description) {
           return this.fooDAO.save(new Foo(id,description));
     }
    
}

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

解决方法

如果未使用适当的隔离级别,则您的方法应该无法读取新事务中的更改。如果将隔离级别设置为READ_COMMITED,则处理方法可以读取创建者方法的更改。

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

如果您具有更高的隔离级别,则该事务可能无法读取通过REQUIRED_NEW事务在方法中所做的更改。举个例子,如果您设置了限制性更强的Isolation.SERIALIZABLE,您的代码将给出一个NotFoundException,因为无法在process方法的事务内部读取在creator方法中所做的更改。