14

MySQLテーブルを次のように構築できるような方法があるかどうか疑問に思っています。

ALTER TABLE `USERINFO`
  ADD CONSTRAINT `FK_USER_ID` FOREIGN KEY (`USERID`) REFERENCES `USERACCOUNT` (`USERID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE;

ただし、これは、休止状態の++jpaが「<property name="hibernate.hbm2ddl.auto" value="create" />」を含むテーブルの構築を開始したときにのみDDLで取得されました。

ALTER TABLE `USERINFO` ADD CONSTRAINT `FK_USER_ID` FOREIGN KEY (`USERID`) REFERENCES `USERACCOUNT` (`USERID`);

私のクラスでは、これらのアノテーション設定があります。

// UserAcc.java
@Entity
@Table(name = "USERACC")
public class UserAcc implements Serializable {

private static final long serialVersionUID = -5527566248002296042L;

@Id
@Column(name = "USERID")
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer userId;


@OneToOne(mappedBy = "userAcc")
private UserInfo userInfo;
....


public UserInfo getUserInfo() {
    return userInfo;
}
public void setUserInfo(UserInfo userInfo) {
    this.userInfo = userInfo;
}
...

と、

// UserInfo.java
@Entity
@Table(name = "USERINFO")
public class UserInfo implements Serializable {

private static final long serialVersionUID = 5924361831551833717L;

@Id
@Column(name = "USERINFO_ID", nullable=false)
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer userInfoId;

@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(name="USERID", nullable=false)
@ForeignKey(name = "FK_USER_ID")
private UserAcc userAcc;


public Integer getUserInfoId() {
    return userInfoId;
}

public void setUserInfoId(Integer userInfoId) {
    this.userInfoId = userInfoId;
}
...

ここでは、UserAccountテーブルが親/メインテーブルであり、UserInfoは別のエンティティに正規化された拡張テーブルであることに注意してください。どんな答えでも大歓迎です。MySQLでも作業するのが大好きなので、それがどのように行われるのか興味があります。親テーブル(USERACOUNT)からレコードを削除することに本当に慣れています。これにより、親/プライマリテーブルの特定のレコードに依存する子レコードを介して削除をカスケードすることもできます。

ありがとう!

4

4 に答える 4

14

JPA は、関連付けられたエンティティに操作 (マージ、永続化、更新、削除) をカスケードする可能性を提供します。ロジックは JPA にあり、データベース カスケードを利用しません。

@OneToMany(cascade=CascadeType.REMOVE)

データベースカスケードでカスケードを行う JPA 標準に準拠した方法はありません。このようなカスケードが優先される場合は、Hibernate 固有の構造@OnDeleteにフォールバックする必要があります。@OneToMany少なくとも で動作しますが、以前は と でいくつかの問題が@OneToOneありました@OnDelete

@OnDelete(action = OnDeleteAction.CASCADE)

この注釈を既存の制約に追加しても更新されないことに注意してください。スキーマを適切に更新するには、最初に手動で削除する必要がある場合があります。

于 2013-02-14T18:50:19.327 に答える
9

JPAでこれを行うための明確な手段はありません。以下は、あなたが望むものを取得します... を使用できますがCascadeType.DELETE、この注釈は 内のオブジェクトにのみ適用されEntityManager、データベースには適用されません。ON DELETE CASCADEがデータベースの制約に追加されていることを確認する必要があります。確認するには、JPA を構成して ddl ファイルを生成できます。ddlファイルを見ると、それON DELETE CASCADEが制約の一部ではないことがわかります。ON DELETE CASCADEファイル内の実際の SQL に追加しddl、ddl からデータベース スキーマを更新します。これで問題が解決します。

このリンクは、MySQLON DELETE CASCADEで on forを使用する方法を示しています。CONSTRAINT制約に対してこれを行います。CREATE TABLEorALTER TABLEステートメントでも実行できます。JPA がALTER TABLEステートメントで制約を作成する可能性があります。ON DELETE CASCADEそのステートメントに追加するだけです。

一部の JPA 実装者は、この機能の手段を提供していることに注意してください。

最後に、Hibernate はOnDelete(action = OnDeleteAction.CASCADE)アノテーションを使用してこの機能を提供します。

于 2013-10-31T01:26:23.457 に答える