当前位置: 首页 > 面试题库 >

SpringBoot JPA不需要@Transactional上的.save()吗?

蒋健
2023-03-14
问题内容

我有一个简短的问题:

我需要repo.save(x)调用@Transactional方法吗?

我问是因为我没有保存就看到了数据库上的更改,并且没有阅读任何有关它的清晰文档。

那么它是按预期的方式工作,还是只是(受欢迎的)意外行为?

例:

@Autowired
private UserRepo repo;

@Transactional  
@PutMapping
public Long put(@RequestBody User user)
{
  User u = repo.findOne(user.getId());
  u.setName("Paul");
  repo.save(u); // DO I NEED THIS LINE?
}

我只是不确定,所以也许有人可以阐明这个话题?


问题答案:

如果您检索实体,例如findOne在事务方法中使用方法调用,则持久化提供者从此刻开始对其进行 管理

现在,如果您对该实体(实际上是代理对象)进行了任何更改,则在提交事务后,无论是否调用saveor update方法,这些更改都将保存到数据库中。

savepersist在从头创建新实体且持久性提供程序尚不知道其存在时必须使用。

请记住,如果在更改发生之前在特定实体上使用detachevict方法,则可以防止在提交时进行任何更改。



 类似资料:
  • 我有一个简短问题: 是否需要对方法调用? 示例: 我只是不太确定,所以也许有人能在这个问题上说点什么?

  • 根据文件,https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md $npm安装--节省开发成本 到目前为止,我使用的所有npm模块都使用

  • 这是我的问题: 我正在Java EE/Spring/Hibernate应用程序上运行批处理。此批处理调用方法1。该方法调用方法2,该方法可以引发用户异常(扩展RuntimeException的类)。下面是它的样子: 在继续执行时捕获异常,但在事务关闭时,method1结束时抛出回滚异常。 这是堆栈跟踪: 当method2不抛出这个异常时,它工作得很好。 我尝试过的: 设置在 尝试并抓住 但这并没有

  • 用户使用门户LoginPortlet进行登录后,登录失败,并在日志中打印警告: 第二次登录后,登录正常。只有在登录页面打开几分钟后,身份验证令牌失效时,才会出现问题。这基本上是好的,但是portal config包含LoginPortlet的排除项。但这份白名单似乎无法避免不必要的检查。还有其他地方可以避免CSRF检查LoginPortlet吗?

  • 问题内容: 如何打印“我喜欢你的脸”而不是“我喜欢打你的脸” 我试过了 但它给出“ TypeError:find()不包含关键字参数” 问题答案: 您可以先删除不需要的标签,然后再获取文字。 但是它保留了所有内容,因此您需要一些工作才能删除它们。 结果 您可以跳过外部范围内的每个对象,而仅保留对象(HTML中为纯文本)。 结果

  • 问题内容: 我仍在尝试围绕@Transactional的工作原理。 我在Service类的方法上有注释,而在Repository类中的方法上有注释。带注释的方法是否适用于带注释的存储库中的方法? 我的理解: 在没有数据的类的方法上,将数据写入数据库,而使用时,则将数据写入数据库。 修改查询 修改方法签名只能返回,或者 更新查询必须是事务性的,标记为 Spring Data将删除所有未刷新的未处理更

  • 问题内容: 我想在应用程序开始时阅读文本数据装置(CSV文件),并将其放入数据库中。 为此,我创建了带有初始化方法(@PostConstruct批注)的PopulationService。 我也希望它们在单个事务中执行,因此我在同一方法上添加了@Transactional。 然而,@Transactional似乎被忽略:该交易启动/停止我的低水平DAO方法。 那我需要手动管理交易吗? 问题答案: