gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:47 25 4
gpt4 key购买 nike

我有一个包含 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com