Hibernate从数据库更新java对象字段

时间:2014-04-03 09:28:36

标签: java hibernate persistence

我有豆

@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;

和一个由hibernate加载的对象,但在保存对数据库的所有更改之前,我需要从数据库中获取当前密码。我正在努力做到这一点

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

但我收到了DuplicateKeyException。

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

3 个答案:

答案 0 :(得分:2)

您可以使用Hibernate从数据库中检索数据,将您的(分离的)bean(来自您的演示文稿或业务层)中的值复制到此JPA bean(Hibernate返回的bean)中,然后让Hibernate更新数据库(在交易结束时),或者如果你想要明确地说明。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

你可以使用Hibernatecallback方法@PrePersist。在执行之前会执行某些操作,您可以将yor fetch password写入本地瞬态变量逻辑。