如何避免在更新Hibernate实体时填写缺少的字段?



我正在开发一个带有用户管理系统的应用程序。有一个名为user的数据库表,其中包含以下列:

| Column Name     | Column Type |
|-----------------|-------------|
| userId          | BIGINT      |
| email           | TEXT        |
| firstName       | TEXT        |
| lastName        | TEXT        |
| passwordDigest  | TEXT        |
| birthday        | DATE        |
| address         | TEXT        |

有一个对应的Hibernate实体叫做User:

@Entity
@Table(name = "user")
public class User {
    @Id
    private long userId;
    private String email;
    private String firstName;
    private String lastName;
    private String passwordDigest;
    private LocalDate birthday;
    private String address;
}

然而,一般用户信息(即电子邮件,名字,姓氏,生日,地址)和密码在我的应用程序的单独页面得到更新。具体来说,有一个"编辑您的一般信息"页面,让用户更新他们的一般信息,并且有一个单独的"更新您的密码";用户更新密码的页面。就像很多其他应用一样。

因此,每个页面的代码将是:
void updateUserGeneralInfo (User newUser) {
    User oldUser = userDao.getExistingUser(newUser.getUserId());
    newUser.setPasswordDigest(oldUser.getPasswordDigest());
    userDao.updateUser(newUser);
}
void updateUserPassword (long userId, String newPassword) {
    User oldUser = userDao.getExistingUser(userId);
    oldUser.setPasswordDigest(calculateDigest(newPassword)); // auto save to DB by Hibernate
}

问题出在updateUserGeneralInfo()。因为newUser是从GUI传递的,所以它不包含passwordDigest。因此,直接调用updateUser(newUser)会在DB中清除用户的passwordDigest。为了避免这种情况,有必要检索用户的现有实体来填充密码摘要,这样updateUser(newUser)就不会影响用户的passwordDigest。这有点笨拙,而且很难维护。

假设允许我重新设计数据库表user和Hibernate实体User。是否有办法避免检索现有实体并在updateUserGeneralInfo()中填充passwordDigest字段?

您可以使用DML语句仅更新您关心的属性,但是托管实体以这种方式工作。当托管实体附加到持久性上下文时,它将同步到数据库。

最新更新