【发布时间】:2021-04-21 09:06:27
【问题描述】:
我正在开发一个带有用户管理系统的应用。有一个名为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) 会清除数据库中用户的passwordDigest。为了避免这种情况,有必要检索用户的现有实体来填写密码摘要,这样updateUser(newUser) 就不会影响用户的passwordDigest。这有点笨重且难以维护。
假设我被允许重新设计数据库表user 和Hibernate 实体User。有什么方法可以避免检索现有实体并在updateUserGeneralInfo() 中填写passwordDigest 字段?
【问题讨论】:
标签: java hibernate orm passwords