9

A基本型のコレクションを持つエンティティがあります (例: String)。Aの各インスタンスに関連付けられた文字列は のライフサイクルに依存するため、このようなマッピングを使用しAます。のインスタンスをADB から削除する場合は、関連付けられ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 のカスケード機能を使用していないようです。これは内部で処理されます。

4

4 に答える 4

7

私は問題を解決しました。

Session.delete()クエリを使用してエンティティを削除することと、クエリを使用してエンティティを削除することHQLは同等だと思いましたが、そうではないようです。クエリを使用HQLすると、依存オブジェクトが自動的に削除されないため、質問で説明されているように外部キー制約エラーが発生します。

を使用Session.delete()すると問題が解決します。また、生成された DDL に CASCADE ポリシーがまだ表示されないため、Hibernate は DB のカスケード機能を使用していないようです。これは内部で処理されます。


モデレーター向け:

過去に質問に回答を追加しましたが(あなたが尋ねたように)、これが問題を解決する回答であり、(他のユーザーからの)回答が投稿されていないため、回答としてここに投稿する必要があると思います.

于 2013-01-15T14:40:59.210 に答える
0

テストフォース削除オーファン:

@Cascade( { org.hibernate.annotations.CascadeType.ALL, 
    org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
于 2012-08-29T09:20:15.503 に答える
0
  • orphanRemoval構成を追加するのはどうですか?

  • A.strings().clear()または、 1 つの A インスタンスを削除する前に手動で呼び出しますか?

上記の両方が機能しない場合は、バグがある可能性がありますElementCollection

于 2012-08-29T09:16:11.433 に答える
-2

「@Cascade」を追加 (org.hibernate.annotations.Cascade)

元:

@Entity
public class A {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "AStrings", joinColumns = @JoinColumn(name = "id"))
    @Column(name = "strings", nullable = false)
    @Cascade(value=org.hibernate.annotations.CascadeType.ALL)
    private Set<String> strings;
}
于 2012-08-29T09:03:28.700 に答える