多くの場合、開発者はJPAとHibernateアノテーションを混在させて使用すると、よくある間違いが発生します。JPAカスケード型アノテーションはHibernateで動作しません。

コードレビューセクションでは、多くのJava開発者がこの間違いを認識しておらず、プログラムが関連するエンティティへのカスケード操作を実行できなかったことが分かりました。私はデモのためにこのリンクを使います://hibernate/hibernate-one-to-many-relationship-example/[1対多の休止状態の例]

間違い

1対多の例では、多くの開発者がJPAカスケードオプションを次のように宣言しました。

...

@UniqueConstraint(columnNames = "STOCK__CODE")})public class Stockはjava.io.Serializableを実装しています。@Entity @Table(名前= "在庫"、カタログ= "mkyong"、uniqueConstraints = {@UniqueConstraint(columnNames = "STOCK__NAME" {...

プライベートセット<StockDailyRecord> stockDailyRecords =新しいHashSet <StockDailyRecord>(0); @OneToMany(fetch = FetchType.LAZY、カスケード= {CascadeType.PERSIST、CascadeType.MERGE}、mappedBy = "stock")public Set <StockDailyRecord> getStockDailyRecords(){return this.stockDailyRecords; } public void setStockDailyRecords(Set <StockDailyRecord> stockDailyRecords){this.stockDailyRecords = stockDailyRecords; } ...

Save it with Hibernate session.

株式デイリーレコード。セットストック(株);
        ストック.getStockDailyRecords()。add(stockDailyRecords);
 
        session.save(stock);
        session.getTransaction()。commit();

どのようなコードをしようとしているときは、 “株式”を保存すると、それは
関連する株式デイリーレコードも同様です。すべてがうまく見えますが、

これは
NOT WORKING

、カスケードオプションは実行されず、
ストックデイリーレコード。間違いを見つけられますか?

===説明

コードを見て、

@ OneToMany

はJPAから来たもので、JPAカスケードを予想していました。

javax.persistence.CascadeType

。しかし、それをHibernateで保存すると
セッション、

org.hibernate.engine.Cascade

は次のチェックを行います…​

if(style.doCascade(action)){
        cascadeProperty(
              persister.getPropertyValue(parent、i、entityMode)、
          タイプ[i]、
                  スタイル、
              何でも、
              偽
        );
    }

Hibernateセーブ・プロセスは

ACTION

SAVE

UPDATE

アクションを引き起こしますが、
JPAは

ACTION

PERSIST




ACTIONMERGE

を渡しますが、JPAは
カスケードの実行に失敗しました。

@seeソースコード

===解決策

JPAカスケードを削除する –

javax.persistence.CascadeType

、それを置き換える
Hibernate cascade –

org.hibernate.annotations.Cascade

で、

CascadeType.SAVE__UPDATE

...
@Entity
@Table(name = "stock", catalog = "mkyong", uniqueConstraints = {
        @UniqueConstraint(columnNames = "STOCK__NAME"),
        @UniqueConstraint(columnNames = "STOCK__CODE") })
public class Stock implements java.io.Serializable {
    ...
    private Set<StockDailyRecord> stockDailyRecords =
                                              new HashSet<StockDailyRecord>(0);

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "stock")
    @Cascade({CascadeType.SAVE__UPDATE})
    public Set<StockDailyRecord> getStockDailyRecords() {
    return this.stockDailyRecords;
    }

    public void setStockDailyRecords(Set<StockDailyRecord> stockDailyRecords) {
    this.stockDailyRecords = stockDailyRecords;
    }
    ...

今、あなたの期待通りに機能します。

結論

JPAとHibernateカスケードアノテーションとの間に互換性のない問題のように見えますが、HibernateがJPA実装である場合、間違ったことが起こる可能性はありますか?


cascade


hibernate

リンク://タグ/jpa/[jpa]