【问题标题】:Hibernate update java object field from databaseHibernate 从数据库更新 java 对象字段
【发布时间】:2014-04-03 09:28:36
【问题描述】:

我有豆子

@Entity
@Table(name = "Users")
public class User {

@Id
@GeneratedValue
@Column(name = "userId")
private Integer userId;

@Column(name = "username")
private String username;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "parentId")
@Fetch(value = FetchMode.SUBSELECT)
private List<User> childs;

@Column(name = "password")
private String password;

@Column(name = "email")
private String email;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "userId")
@Fetch(value = FetchMode.SUBSELECT)
private List<Role> roles;

和一个由休眠加载的对象,但在将所有更改保存到数据库之前,我需要从数据库中获取当前密码。我正在尝试这样做

if (user.getPassword() == null) { user.setPassword(userDao.getUserById(user.getUserId()).getPassword());}

但我收到 DuplicateKeyException。

那么,我该怎么做呢?或者,我可以保存除密码以外的所有字段吗?

【问题讨论】:

    标签: java hibernate persistence


    【解决方案1】:

    您可以使用 Hibernate 从数据库中检索数据,将值从您的(分离的)bean(来自您的表示层或业务层)复制到这个 JPA bean(由 Hibernate 返回的那个),然后让 Hibernate 更新数据库(在交易结束时),或者如果您愿意,也可以明确表示。

    【讨论】:

    • 我之前应该注意到这一点:我正在尝试这样做if (user.getPassword() == null) { user.setPassword(userDao.getUserById(user.getUserId()).getPassword()); 但我得到了 DuplicateKeyException
    【解决方案2】:

    您可以使用注释@Column(updatable=false) 将字段从数据库更新中排除

    【讨论】:

    • 然后在这种情况下使用专用的 hql 查询对其进行更新,它将忽略 updatable=false
    【解决方案3】:

    你可以使用 Hibernatecallback 方法 @PrePersist。在持久存在之前执行一些操作,您可以将您的密码写入本地瞬态变量逻辑。

    【讨论】:

      猜你喜欢
      • 2019-10-27
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      相关资源
      最近更新 更多