0

私は満たすために2つのテーブルUSERとUSERDETAILを作成したいと思います:

  1. USERDETAIL には USER テーブルへの参照があります。

  2. USER テーブルの操作では、USERDEAIL テーブルの存在を意識する必要はありません。

これは、1 対 1 の非双方向の関係である必要があります。

エンティティ クラス:

@Entity
@Table(name="USER")
public class User implements Serializable{  
    @Id 
    @Column(name="ID")
    @GeneratedValue(generator = "system-uuid") 
    @GenericGenerator(name = "system-uuid", strategy = "uuid")  
    private String id;  
    //...
}

@Entity
@Table(name="USERDETAIL")
public class UserDetail implements Serializable{    

    @Id 
    @Column(name="ID")
    @GeneratedValue(generator = "gen") 
    @GenericGenerator(name = "gen", strategy = "foreign",
    parameters = @Parameter(name = "property", value = "user"))
    private String id;

    @OneToOne(optional= false , targetEntity=User.class, cascade= CascadeType.ALL)
    @OnDelete(action = OnDeleteAction.CASCADE)
    //@JoinColumn(name="foreign_id",referencedColumnName="ID")
    @PrimaryKeyJoinColumn   
    private User user;  
    //...
}

これにより、2 つのテーブルが正しく作成され、USERDETAIL には、主キーが USER の ID によって参照されるという外部キー制約があります。ただし、削除時のアクションはそうではRestrictありませんCascade。このため、USER の行を削除できません。

MySQL サーバー 5.1 を使用しています。削除アクションがカスケードである場合はサポートされていないようです。制約を手動で削除し、削除時に設定された新しい制約を追加できるため、カスケードされ、期待どおりに機能します。

4

2 に答える 2

0

最後に、私は問題を解決しました。

まず、http: //www.mkyong.com/hibernate/hibernate-one-to-one-relationship-example-annotation/に従ってoneToOneマッピングエンティティを作成しました。

ただし、Tomcatを起動すると、常にNullPointerExceptionマッピングがスローされます。したがって、私は自分の質問エンティティを考え出し、削除を除いて正常に機能しているようです。

私はついにそれが冬眠-冬眠が引き起こす単なるバグであることに気づきました。次に、3.4.0.gaバージョンを使用して、リンクを再度たどります。置換すること@GeneratedValue(strategy = IDENTITY)で(なぜこれを使用するのかわかりませんが、hibernateはテーブルを作成できません)

@GeneratedValue(generator = "system-uuid") 
@GenericGenerator(name = "system-uuid", strategy = "uuid") 

期待どおりに動作します。

テーブルに外部キー制約はありませんが、所有者(USER)テーブルを削除すると、休止状態のハンドルを使用して子(USERDETAIL)テーブルを正しく削除することもできます。

また、子フィールドがない所有者テーブルの更新について心配する必要はありません。mappedByKhue Vuが言ったように、サイドには実際には物理マッピングが定義されていません。Hibernateは、リレーションを削除しないほど賢いです。

于 2012-09-21T09:21:24.143 に答える
0

コードは次のようになります。

@Entity
@Table(name="USER")
public class User implements Serializable{  
    @Id 
    @Column(name="ID")
    @GeneratedValue(generator = "system-uuid") 
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    private String id;  
    //...

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="userdetail_id")
    public UserDetail getUserDetail() {
      ...
    }
}

@Entity
@Table(name="USERDETAIL")
public class UserDetail implements Serializable{    

    @Id 
    @Column(name="ID")
    @GeneratedValue(generator = "gen") 
    @GenericGenerator(name = "gen", strategy = "foreign",
    parameters = @Parameter(name = "property", value = "user"))
    private String id;

    @OneToOne(optional= false , targetEntity=User.class, mappedBy = "userDetail")
    @PrimaryKeyJoinColumn   
    private User user;  
    //...
}

基本的に、Userクラスが所有者である(UserDetailクラスでmappedByを使用することにより)双方向にすることをお勧めします。そうすれば、ユーザーを削除すると、ユーザーの詳細が削除されます。

于 2012-09-17T08:19:15.000 に答える