我尝试将实体列表保存到Oracle Db。
@Transactional
public void save() {
//logick
for (QuittanceType quittanceType : quittance) {
quittancesService.parseQuittance(quittanceType);
}
//logick
}
在每个步骤中,我都调用此方法:
@Transactional
@Override
public void parseQuittance(QuittanceType quittance) {
try {
//logick create payToChargeDb
paymentToChargeService.saveAndFlush(payToChargeDb);
} catch (Exception e) {
log.warn("Ignore.", e);
}
}
和方法
@Override
public PaymentsToCharge saveAndFlushIn(PaymentsToCharge paymentsToCharge) {
return paymentToChargeRepository.saveAndFlush(paymentsToCharge);
}
当我尝试保存具有约束的实体时,我的主要交易回滚并获得堆栈跟踪:
Caused by: java.sql.BatchUpdateException: ORA-02290: CHECK integrity constraint violated(MYDB.PAYMENTS_TO_CHARGE_CHK1)
但是我想不跳过成功实体并保存成功。我破坏了我的方法
@Transactional(propagation = Propagation.REQUIRES_NEW)
它看起来像这样:
@Transactional
@Override
public void parseQuittance(QuittanceType quittance) {
try {
//logick create payToChargeDb
paymentToChargeService.saveAndFlushInNewTransaction(payToChargeDb);
} catch (Exception e) {
log.warn("Ignore.", e);
}
}
和
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public PaymentsToCharge saveAndFlushInNewTransaction(PaymentsToCharge paymentsToCharge) {
return paymentToChargeRepository.saveAndFlush(paymentsToCharge);
}
但是当我尝试保存带有约束的实体时,我没有得到异常,也没有进入catcj块。只需停止调试,应用程序即可继续工作。我没有任何错误。好像正在回滚
答案 0 :(得分:1)
由@Transactional
创建的代理不会拦截对象内的调用。
在代理模式(默认)下,仅外部方法调用 通过代理进入的邮件被拦截。这意味着 自我调用(实际上是目标对象内的一种方法 目标对象的另一种方法)不会导致实际 运行时的事务,即使被调用的方法标记有 @交易。另外,必须完全初始化代理以提供 预期的行为,因此您不应该依赖此功能 初始化代码(即@PostConstruct)。