我正在开发一个带有用户管理系统的应用程序。有一个名为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语句仅更新您关心的属性,但是托管实体以这种方式工作。当托管实体附加到持久性上下文时,它将同步到数据库。