A
基本型のコレクションを持つエンティティがあります (例: String
)。A
の各インスタンスに関連付けられた文字列は のライフサイクルに依存するため、このようなマッピングを使用しA
ます。のインスタンスをA
DB から削除する場合は、関連付けられString
ている も削除する必要があります。
私のマッピングは次のとおりです。
@Entity
public class A {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "name", nullable = false, unique = true)
private String name;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "AStrings", joinColumns = @JoinColumn(name = "id"))
@Column(name = "strings", nullable = false)
private Set<String> strings;
}
のインスタンスを作成しA
て文字列を追加すると、 を使用してインスタンスを永続化できますSession.save(myInstance)
。のインスタンスA
とそれに関連付けられたString
の両方が永続化されます。
しかし、を使用して DB から同じインスタンスを削除したい場合Session.createQuery("delete A a where a.name = ?").setString(0, name).executeUpdate()
、外部キー制約エラーが発生します。
親行を削除または更新できません: 外部キー制約が失敗します
String
しかし、 のインスタンスを削除する前に、関連する が自動的に削除されることを期待していA
ますが、そうではないようです。また、カスケード ルールを指定する方法も見つかりませんでした。
構成に何か問題がありますか?
ありがとう
編集:@Cascade(CascadeType.DELETE)
on the field も使用してみましたstrings
が、まだ役に立ちません。ON DELETE
データベースを見ると、関連する外部キーのポリシーがわかりません。
同じ問題を抱えている人が JIRA を開きました: https://hibernate.onjira.com/browse/HHH-4301。解決策 (または回避策) が存在する必要があります。使用しているのは私だけではありません@ElementCollection
。
問題を解決しました。Session.delete() を使用して削除するか、HQL クエリを使用して削除することは同等だと思っていましたが、そうではないようです。HQL クエリを使用すると、依存オブジェクトが自動的に削除されないため、外部キー制約エラーが発生します。Session.delete() を使用すると、問題が解決します。また、生成された DDL にまだ CASCADE ポリシーが表示されないため、Hibernate は DB のカスケード機能を使用していないようです。これは内部で処理されます。