私は満たすために2つのテーブルUSERとUSERDETAILを作成したいと思います:
USERDETAIL には USER テーブルへの参照があります。
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 を使用しています。削除アクションがカスケードである場合はサポートされていないようです。制約を手動で削除し、削除時に設定された新しい制約を追加できるため、カスケードされ、期待どおりに機能します。