我有一个方法,它调用另一个方法来保存具有新事务的实体对象。
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(传播=传播。需要\u NEW)创建foo对象。
public class FooCreator {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Foo createFoo(final String id, final String name, final String description) {
return this.fooDAO.save(new Foo(id, name, description));
}
}
在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_COMMITED
,您的流程方法可以读取创建者方法的更改。
@Transaction(isolation = Isolation.READ_COMMITTED)
public Foo process(final String id, final String name, final String description) {
}
如果您有更严格的隔离级别,则事务可能无法使用所需的\u新事务读取方法中所做的更改。举个例子,如果设置了更严格的隔离。可序列化,您的代码将给出NotFoundException,因为无法在process方法的事务内读取creator方法中所做的更改。
一些背景知识,我在我的web应用程序中使用JPA/Hibernate/Spring,我也使用org。springframework。orm。jpa。支持OpenEntityManagerViewFilter和用于处理实体的扩展持久性上下文。 问题: > 使用find方法从数据库加载实体,实体存储在会话中 用户更改实体并点击保存 用户更改反映在会话中存储的实体上(在控制器中) 实体被发送到服务类中的
我可以在Spring Boot应用程序中保存实体,而无需。我之所以注意到这一点,是因为在中的方法中添加了之后,我才能够更新实体。 我没有在类级别上注释。在我的服务层中找到的唯一其他位置是不属于方法的方法。我的未扩展。它用注释。我有作为依赖项。我也不是手动开始或提交事务。 员工ontroller.java 员工ervice.java
以下是使用事务教程中描述的和回滚的代码示例。 此示例代码是基于前面章节中完成的环境和数据库设置编写的。 复制并将以下示例代码保存到:JDBCSavepoint.java 中,编译并运行如下 - 编译并运行结果如下 - 可以看到,上面代码中只回滚到保存点(ROWS_DELETED_1),所以ID为的这一行记录没有被删除,而ID为的记录因为没有设置回滚点,直接提交删除了。
问题内容: 我有一个用@Transactional注释的方法。我从Oracle数据库检索一个对象,更改一个字段,然后从该方法返回。我忘了保存对象,但是发现无论如何都会更新数据库。 applicationContext 我的方法 我的问题是为什么MyObject会持久保存到数据库? 问题答案: 因为hibernate将自动检测对 持久性 实体所做的更改并相应地更新数据库。hibernate参考手册的
问题内容: 我有一个用@Transactional注释的方法。我从Oracle数据库检索一个对象,更改一个字段,然后从该方法返回。我忘了保存对象,但是发现无论如何都会更新数据库。 applicationContext 我的方法 我的问题是为什么MyObject会持久保存到数据库? 问题答案: 因为hibernate将自动检测对持久实体所做的更改并相应地更新数据库。hibernate参考手册的第11