2012-10-09 197 views
0

我有两个持久实体:UserUserDetail。他们有一对一的关系。我使用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 

} 

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_DETAILUSER_DETAIL table

但是,当我尝试更改用户信息时,我得到一个不正确的行为。我得到下面的表格后,我重新设置用户信息:

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

enter image description here

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

回答

1

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

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

要确保你不救2种UserDetail情况下,同一个用户,你应该在UserDetail数据库表的USER_ID列添加一个唯一约束。

+0

我可以以某种方式让Hibernate在数据库级别检查数据的一致性吗?没有这样的情况,几个对象与一个用户有关,但与一对一的关系 – Michael

+1

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