java - 使用 Spring Data JPA 更新实体的正确方法是什么?

标签 java spring hibernate jpa spring-data

我有一个包含 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 可能比更新所有字段的性能更差。

显然 this is implementation-specific and not part of JPA .

关于java - 使用 Spring Data JPA 更新实体的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26761870/

相关文章:

java - 在 Cassandra 中实现 FIFO 读取

java - 如何修改读取 vector 的正则表达式来读取矩阵?

java - QueryDsl SpringData Jpa findAll 如何避免count()

java - @ManyToMany 没有连接表(遗留数据库)

java - 添加 "query.getResultList()"时编译器发出警告

java - 连接到127.0.0.1端口8080失败: Connection refused

java - 使用@WebMvcTest 的 Spring Boot 测试在 Atlassian Bitbucket 管道上失败

spring security OAuth2 - 自定义 ClientDetailsS​​ervice

Spring Boot Servlet API 版本

java - hibernate在多对多关系的查询中不定位连接表