данные весны, спящий режим, не могут сохранить связанный объект в требуемой новой транзакции - PullRequest
0 голосов
/ 01 ноября 2018

У меня 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); сервер просто висит без ошибок

1 Ответ

0 голосов
/ 01 ноября 2018

Вы пытались добавить @ManyToOne(cascade=CascadeType.MERGE) в вашу сущность?

@ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.MERGE)
@JoinColumn(name = "ORIGIN_CHARGE_GUID")
private Charge chargeOrigin;

Это должно обновить chargeOrigin, когда вы обновите charge. Кроме того, вы всегда можете объединить старый заряд и обновить новый.

charge.setIsActive(true);
Charge oldCharge = chargeService.findById(charge.getChargeOrigin().getGuid());
oldCharge.setActive(false);
chargeService.saveOneCharge(oldCharge);
chargeService.saveOneCharge(charge);

В последнем случае у вас не должно быть аннотации @ManyToOne(cascade=CascadeType.MERGE) в вашей сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...