カスケード – JPA
多くの場合、開発者は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; } ...
今、あなたの期待通りに機能します。