【问题标题】:How to avoid filling in missing fields when updating a Hibernate entity?更新 Hibernate 实体时如何避免填写缺失的字段?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 您能告诉我 DML 语句如何帮助我解决这个问题吗?谢谢。
    • 例如,如果您只想更新用户名,请使用entityManager.createQuery("UPDATE User u SET u.username = :name WHERE u.id = :id").setParameter("id", userId).setParameter("name", username).executeUpdate()
    • 我明白了。感谢您提供 DML 语句示例。但是,这似乎有点乏味,尤其是在添加/修改User 的字段时。我正在寻找的是一种代码易于维护的方式。
    • 您还可以使用像 Blaze-Persistence Entity-Views 这样的工具,它允许您对此进行建模并在幕后为您创建这些更有效的 DML 语句:persistence.blazebit.com/documentation/1.6/entity-view/manual/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多