休眠OneToOne关系 [英] Hibernate OneToOne relationship

查看:179
本文介绍了休眠OneToOne关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个持久化实体: User UserDetail 。他们有一对一的关系。我使用hibernate注释。但我正在为我的数据库获取一个用户信息的几个对象。显然,我对Hibernate注释的了解并不是很好解决这个问题。



用户 class:

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

@Id
@GeneratedValue
@Column(name =ID)
私人长ID;

@Column(name =NAME)
私人字符串名称;

@Column(name =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用户用户;

//其他字段

}

我在我的代码中使用这个如下:

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

一切正常。以下是我的表 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 列上。


I have two persistence entity: User and UserDetail. They have one-to-one relationship. I use hibernate annotations. But I am getting in my database several objects of user information for one same user. Apparently my knowledge of Hibernate annotations are not so good to solve this problem.

User class:

@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 class:

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

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

   // other fields

}

I use this in my code as follows:

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

And everything works properly. Here's what my table USER_DETAIL:

But when I try to change user information, I get an incorrect behavior. I get following table after I again set user information:

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

Why the same two objects of information correspond to one user?? I have One-To-One relationship. How can I avoid this? What am I doing wrong?

解决方案

If you want to modify an existing UserDetail, then you must set its ID, or get it from the session and modify it. Else, Hibernate thinks it's a new one that must be saved, since it doesn't have any ID.

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

To make sure you don't save two UserDetail instances for the same user, you should add a unique constraint on the USER_ID column of the UserDetail database table.

这篇关于休眠OneToOne关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆