2012-10-09 3 views
0

두 지속성 엔티티가 있습니다 : UserUserDetail입니다. 그들은 일대일 관계가 있습니다. 나는 최대 절전 모드 주석을 사용한다. 그러나 나는 동일한 데이터베이스 사용자 정보를 여러 사용자에게 제공하고 있습니다. 분명히 Hibernate 주석에 대한 지식은이 문제를 해결하는 데 그리 좋지 않다.최대 절전 모드 OneToOne 관계

사용자 클래스 :

@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 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); 

당신이 UserDetail 데이터베이스 테이블의 USER_ID 열에 대한 고유 제한 조건을 추가해야합니다, 당신은 동일한 사용자에 대한 두 UserDetail 인스턴스를 저장하지 않는 확인하십시오.

+0

어떻게 든 Hibernate가 데이터베이스 레벨에서 데이터의 일관성을 검사 할 수 있습니까? 여러 개체가 한 사용자와 관련이 있지만 일대일 관계가있는 그런 상황은 없었습니다. – Michael

+1

* 동일한 사용자에 대해 두 개의 UserDetail 인스턴스를 저장하지 않으려면 USER_ID 열에 고유 제약 조건을 추가해야합니다 UserDetail 데이터베이스 테이블의 * –