transactions - Spring Boot 一笔交易多回购
问题描述
我正面临这个问题
我有这项服务,有很多存储库。persistBDD() 方法,获取一个包含大量信息的对象,我必须分发信息并将其设置为不同的实体。
我需要在一个事务中保留所有信息。问题是当我在 EmpleoDependiente 中遇到异常时,例如 empleoRepo.save(empleo); Persona 和 PersonaNatural 的数据已经被持久化了,甚至persistBDD 方法也被@Transactional 注释。
谢谢你的帮助。
@Service
public class SolicitudReclamoService {
@Autowired
PersonaNaturalRepository personaNaturalRepo;
@Autowired
PaisRepository paisRepo;
@Autowired
PersonaJuridicaRepository personaJuridicaRepo;
@Autowired
EmpleoDependienteRepository empleoRepo;
@Transactional()
public void persistBDD(registros registro) {
Persona p = new Persona();
p.setDenominacion(registro.titular.persona.denominacion);
p.setIdentificacion(registro.titular.persona.identificacion);
p.setTipoIdentificacion(registro.titular.persona.codTipoIdentificacion);
Pais pais = paisRepo.findById(DEFAULT_COUNTRY_CODE).orElse(null);
PersonaNatural pn = new PersonaNatural();
pn.setApellidoMaterno(registro.titular.personaNatural.apellidoMaterno);
pn.setApellidoPaterno(registro.titular.personaNatural.apellidoPaterno);
pn.setCanal(new Canal("1", null));
pn.setEstadoCivil(new EstadoCivil(registro.titular.personaNatural.codEstadoCivil, null));
pn.setFechaFallecimiento(fchFallecimiento);
pn.setFechaMatrimonio(fchMatrimonio);
pn.setFechaNacimiento(fchNacimiento);
pn.setIdentificacion(registro.titular.personaNatural.identificacion);
pn.setPais(pais);
pn.setPersona(p);
pn.setPrimerNombre(registro.titular.personaNatural.primerNombre);
pn.setSegundoNombre(registro.titular.personaNatural.segundoNombre);
pn.setSexo(registro.titular.personaNatural.sexo);
pn.setUsuarioCreacion("TEST");
pn.setUsuarioModificacion("TEST");
// empleos
personaNaturalRepo.save(pn);
if (!registro.titular.empleos.empleo1.identificacion.isBlank()) {
PersonaJuridica pj = personaJuridicaRepo
.findByIdentificacion(registro.titular.empleos.empleo1.identificacion).orElse(null);
if (pj == null) {
pj = buildPersonaJuridicaEmpleo1Data(registro.titular.empleos.empleo1);
}
EmpleoDependiente empleo = buildEmpleo1Data(registro);
empleo.setPersonaNatural(pn);
empleo.setPersonaJuridica(pj);
empleoRepo.save(empleo);
}
}
private EmpleoDependiente buildEmpleo1Data(registros registro) {
EmpleoDependiente ed1 = new EmpleoDependiente();
ed1.setCanal(new Canal("1", null));
ed1.setCargo(registro.titular.empleos.empleo1.cargo);
ed1.setEstado("I");
ed1.setFechaIngreso(formatFecha(registro.titular.empleos.empleo1.fechaIngreso));
ed1.setSalario(registro.titular.empleos.empleo1.mntSalario);
ed1.setUsuarioCreacion("TEST");
ed1.setUsuarioModificacion("TEST");
return ed1;
}
private PersonaJuridica buildPersonaJuridicaEmpleo1Data(Empleo1 empleo) {
Persona p = new Persona();
p.setDenominacion(empleo.razon_Social);
p.setIdentificacion(empleo.identificacion);
p.setTipoIdentificacion("R");
PersonaJuridica pj = new PersonaJuridica();
pj.setActividadEconomica(null);
pj.setActividadIess(null);
pj.setCanal(new Canal("1", null));
pj.setIdentificacion(empleo.identificacion);
pj.setListaBlanca("N");
pj.setLlevaContabilidad("N");
pj.setPersona(p);
pj.setRazonSocial(empleo.razon_Social);
pj.setUsuarioCreacion("TEST");
pj.setUsuarioModificacion("TEST");
return pj;
}
}
解决方案
推荐阅读
- php - 如何仅在当前时间更新和设置所有行
- sql - 将 nvarchar(50) 转换为日期格式
- python - 索引和列表 - 索引超出范围
- javascript - Convert Special Quoations to Normal Quoations
- javascript - 如何打印包含与用户输入数据相对应的数据的数组?
- http - Get result from chilkatHttp.PostUrlEncodedAsync in VB6
- selenium - 为什么手动访问和通过 ChromeDriver 和 Chrome 通过 Selenium 访问时 robots.txt 的内容不同
- mongodb - 如何在组查询中正确使用 toDate
- python - 函数 addFunc 在 0x10fae4f28
- python - 如何在python中生成2个不相关的列表?