1

次の関係を持つ 2 つのエンティティを保存したいと思います。

@Entity
public class Synonyme {
    @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name="ID", nullable = false)
    private List<Term> terms = new ArrayList<>();
}

@Entity
public class Term {
   private String word;
   public static createTerm(String word, Synonyme newSyn, Long someothercriteria) {
    Term term = new Term();
    ...
    newSyn.addTerm(term);
   }
}

そして、私はそれらを次のように保存したい:

Synonyme newSyn= Synonyme.createSynonyme ();

entityManager.persist(newSyn);

for(String word : words) {
    Term term = Term.createTerm(word, newSyn, 0L );
}

 entityManager.flush();

これらのコードは Junit-Test で正常に動作します (Junit-Test は Spring のメモリ内データベースを使用します) が、実際のデータベースでそれらを使用すると、次の例外が発生しました。

Caused by: javax.persistence.PersistenceException: org.hibernate.jdbc.BatchedTooManyRowsAffectedException: Batch update returned unexpected row count from update [0]; actual row count: 2; expected: 1

この例外がわかりません。それはどういう意味ですか?

4

2 に答える 2

1

(コメントするには長すぎるので、回答を追加してください)

と のコードで質問を更新する必要がSynonyme.createSynonyme()ありTerm.createTerm()ます。

あなたの@OneToManyマッピングは奇妙です。それが問題の原因である可能性があります (コレクション マッピングのドキュメントを参照してください)。この@OneToManyターゲット テーブル (Term) には、ソース テーブル (Synonyme) への外部キーが含まれています。そうは言っても、IDおそらくあなたが望む列ではなく、のようなものですSYNONYME_ID。興味のある人が全体像を把握できるように、テーブル構造を投稿することもできます。マッピングが問題ないように見えると、マッピングが修正されたときに問題が解決されない場合、問題の解決策を探すのがより簡単になります。

于 2014-11-18T10:36:37.057 に答える
0

これは通常、実際の DBMS ではなく休止状態で主キーを定義したことを意味します。

そして、同じ主キー (「実際の行数 2、予想される 1」) を持つ 2 つの行があるため、休止状態は単純な非更新クエリ (!) を実行することさえできません。

修正するには、重複した行を DBMS で削除するか、そのテーブルの休止状態のキー定義を変更します。

于 2021-09-14T17:58:54.737 に答える