0

私は2つの永続性エンティティを持っています:UserUserDetail. それらは 1 対 1 の関係にあります。休止状態の注釈を使用します。しかし、同じユーザーのユーザー情報のいくつかのオブジェクトをデータベースに取得しています。どうやら、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);

ここに画像の説明を入力

同じ 2 つの情報オブジェクトが 1 人のユーザーに対応するのはなぜですか?? 私は一対一の関係を持っています。どうすればこれを回避できますか? 私は何を間違っていますか?

4

1 に答える 1

1

既存の を変更する場合はUserDetail、その ID を設定するか、セッションから取得して変更する必要があります。それ以外の場合、ID がないため、Hibernate はそれを保存する必要がある新しいものと見なします。

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

同じユーザーに対して 2 つの UserDetail インスタンスを保存しないようにするには、データベース テーブルのUSER_ID列に一意の制約を追加する必要があります。UserDetail

于 2012-10-09T09:10:45.103 に答える