休眠OneToOne关系 [英] Hibernate OneToOne relationship
问题描述
我有两个持久化实体: 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屋!