0

我有两个持久性实体:UserUserDetail. 他们是一对一的关系。我使用休眠注释。但是我在我的数据库中获取了同一用户的多个用户信息对象。显然,我对 Hibernate 注释的了解并不能很好地解决这个问题。

用户等级:

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

   @Id
   @GeneratedValue
   @Column(name = "ID")
   private Long id; 

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

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

   @OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
   private UserDetail userDetail;

   // setters and getters

}

用户详细信息类:

@Entity
@Table(name = "USER_DETAIL")
public class UserDetail {  

   @OneToOne
   @JoinColumn(name = "USER_ID")
   private User user;

   // other fields

}

我在我的代码中使用它如下:

UserDetail userDetail = new UserDetail();
userDetail.setInfo(info);
userDetail.setUser(seventhUser);
hibernateTemplate.saveOrUpdate(userDetail);

一切正常。这是我的桌子USER_DETAILUSER_DETAIL 表

但是当我尝试更改用户信息时,我得到了不正确的行为。再次设置用户信息后得到下表:

UserDetail newUserDetail = new UserDetail();
newUserDetail.setInfo(newInfo);
newUserDetail.setUser(seventhUser);
hibernateTemplate.saveOrUpdate(newUserDetail);

在此处输入图像描述

为什么相同的两个信息对象对应一个用户?我有一对一的关系。我怎样才能避免这种情况?我究竟做错了什么?

4

1 回答 1

1

如果要修改现有的UserDetail,则必须设置其 ID,或从会话中获取并修改它。否则,Hibernate 认为它是一个必须保存的新的,因为它没有任何 ID。

UserDetail existingUserDetail = session.get(UserDetail.class, theUserDetailId);
existingUserDetail.setInfo(newInfo);

为确保您不会为同一用户保存两个 UserDetail 实例,您应该在数据库表的USER_ID列上添加唯一约束。UserDetail

于 2012-10-09T09:10:45.103 回答