繁体   English   中英

休眠OneToOne关系

[英]Hibernate OneToOne relationship

我有两个持久性实体: 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

}

UserDetail类:

@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_DETAIL USER_DETAIL表

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

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_ID列上添加唯一约束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM