Java Hibernate-OneToOne关系

Java Hibernate-OneToOne关系,java,hibernate,hibernate-mapping,hibernate-annotations,Java,Hibernate,Hibernate Mapping,Hibernate Annotations,我有两个持久性实体:User和UserDetail。他们有一对一的关系。我使用hibernate注释。但是我在数据库中得到了同一个用户的多个用户信息对象。显然,我对Hibernate注释的了解并不能很好地解决这个问题 用户类别: @Entity @Table(name = "USER") public class User { @Id @GeneratedValue @Column(name = "ID") private Long id; @Column(n

我有两个持久性实体:
User
UserDetail
。他们有一对一的关系。我使用hibernate注释。但是我在数据库中得到了同一个用户的多个用户信息对象。显然,我对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类:

@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);
一切正常。以下是我的表格
用户详细信息

但是当我试图更改用户信息时,我得到了一个错误的行为。再次设置用户信息后,得到下表:

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


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

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

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

为确保不为同一用户保存两个UserDetail实例,应在
UserDetail
数据库表的
user\u ID
列上添加唯一约束。

我可以让Hibernate在数据库级别检查数据的一致性吗?不存在多个对象与一个用户相关但具有一对一关系的情况。要确保不为同一用户保存两个UserDetail实例,应在UserDetail数据库表的user_ID列上添加唯一约束