1 つのトランザクションで OL オブジェクトのリストを含むオブジェクト O を永続化する必要があります。
@Entity
public class O {
@OneToMany
private List<OL> olist;
// getters/setters
}
O と OL をファイル (xml インターフェース) から読み取っていて、それらを DB に挿入する必要があります。条件は次のとおりです。OL オブジェクトの永続化中に例外がスローされた場合は、無視して他の OL を続行します。
@Transactional
private persistO(...) {
O o = new O();
o.set(...);
oDao.persist(o);
for (int i = 0; i < olCount; i++) {
OL ol = new OL();
ol.set(...);
try {
olDao.persist(ol);
em.flush();
}
catch(ConstraintViolationException ex) {
logger.warn()...;
}
}
}`
問題は、最初ConstraintViolationException
にトランザクションが rollbackOnly に設定され、何も永続化されないことです。
org.springframework.transaction.TransactionSystemException:
Could not commit JPA transaction;
nested exception is javax.persistence.RollbackException:
Transaction marked as rollbackOnly
質問:これは JPA (Hibernate + Spring) でどのように実現できますか?
ノート
- 最初にDBでクエリを作成し、OLオブジェクトがまだ存在しないことを確認することが可能かもしれないことは知っていますが、手順が非常に複雑でパフォーマンスが大幅に低下すると仮定しましょう.
- この要件では、OL オブジェクトを新しいトランザクション (すべてかゼロか) で永続化することはできないため、
@Transactional(propagation = Propagation.PROPAGATION_REQUIRES_NEW)
使用できません。