我有一个包含 FK 到另一个表的表帐户。
选项 1:
@Override
@Transactional(readOnly = false)
public Account changePassword(Account existingAccount, String newPassword){
existingAccount.setPassword(newPassword);
return accountDAO.save(existingAccount);
}
这样,每当我调用 save() 时,都会进行连接以检索另一个表 ID,然后更新本身。
请注意,即使只有密码更改,所有字段也会在这里更新。
< br/>
编辑: 我发现正在进行连接是因为我将实体作为参数 (existingAccount) 传递。如果我在 changePassword 方法中找到它,它工作正常(无连接)。问题是,我需要在 Controller 中使用此实体进行验证,因此对同一个数据库调用 2 次毫无意义。
选项 2:
@Modifying
@Query("UPDATE Account SET password=(:pass) WHERE username=(:username)")
public void changePassword(@Param("username")String username, @Param("pass")String pass);
这样,只有@Query中的自定义更新被执行。
我认为就性能而言,选项 2 可能更好,但选项 1 感觉更像 jpa。任何建议表示赞赏。
最佳答案
这两个应该没问题。如果您想使用第一种方式但避免更新密码以外的字段,您可以 configure dynamic-update使用注释 @DynamicUpdate(value=true)
:
dynamic-update (optional - defaults to false): specifies that UPDATE SQL should be generated at runtime and can contain only those columns whose values have changed.
您需要对此使用更新前选择或乐观锁定。 select-before-update 可能比更新所有字段的性能更差。
关于java - 使用 Spring Data JPA 更新实体的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26761870/