У меня Entity
отношение к этой сущности.
@Data
@Entity
@Table(name = "CHARGES")
public class Charge {
@Id
@Column(name = "GUID", nullable = false)
private String guid;
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ORIGIN_CHARGE_GUID")
private Charge chargeOrigin;
@Column(name = "IS_ACTIVE")
private Boolean isActive;
Столбец IS_ACTIVE
имеет ограничение (только один Charge
может быть true
)
Каждый заряд, который я сохраняю в методе с @Transactional(propagation = Propagation.REQUIRES_NEW)
Это выглядит так:
@Transactional
public void mainMethod { // Root transaction
for (Charge charge: charges) {
//try
saveOneCharge(charges);
//catch
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)//internal transaction
public Charge saveOneCharge(Charge charge) {
return chargesRepository.saveAndFlush(charge);
}
Но теперь мне нужно изменить isActive
в обоих обвинениях:
charge.seActive(True);
charge.getChargeOrigin().setActive(false);
chargeService.saveOneCharge(charge)
и я получаю исключение (исключение ограничения)
Мне нужно изменить этот код на:
charge.setIsActive(false);
charge.getChargeOrigin().setActive(false);
Charge deactivatedCharge = chargeService.saveAndFlush(charge.getChargeOrigin());
charge.setChargeOrigin(deactivatedCharge);
chargeService.saveOneCharge(charge)
Но в этом случае мой сервер не выкидывает исключения, а зависает.
EDIT
Я немного переписал код, ища ответ, и вот часть реального проекта:
@Transactional
private void methodWithMainTransaction() {
for (Charge charge: charges) {
chargeService.changeChargeActivation(charges);
}
способ обслуживания:
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Charge changeChargeActivation(Charge charge) {
Charge chargeOrigin = charge.getChargeOrigin();
if (chargeOrigin != null) {
chargeOrigin.setIsActive(!chargeOrigin.getIsActive());
chargesRepository.saveAndFlush(chargeOrigin);
}
charge.setIsActive(!charge.getIsActive());
return chargesRepository.saveAndFlush(one);
}
На линии chargesRepository.saveAndFlush(chargeOrigin);
сервер просто висит без ошибок