Операция удаления Spring Jpa не работает после выборки определенного списка - PullRequest
0 голосов
/ 20 сентября 2018

Это мои сущности;

@Entity
 public class IpAddress{

    @Id
    @Column(nullable = false, updatable = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ")
    @Getter
    private Long id;

     @ManyToOne(fetch = FetchType.LAZY)
     private final Application application;

     .....
 }

@Entity
public class Application{

@Column(nullable = false, updatable = false)
private final String applicationId;

@OneToMany(mappedBy = "application", cascade = CascadeType.ALL, orphanRemoval = true)
private List<IpAddress> ipAddresses = new ArrayList<>();
}

@Entity
public class MerchantApplication {

    @Id
    @Column(nullable = false, updatable = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ")
    @Getter
    private Long id;
    @OneToOne
    private final Merchant merchant;

    @OneToOne(cascade = CascadeType.ALL)
    private final Application application;

    @ManyToOne(fetch = FetchType.LAZY)
    private final User user;
}

это метод службы, который я пытаюсь удалить:

@Transactional
    public void deleteIpAddressForMerchant(Long merchantId,Long ipAddressId) {

        Merchant merchant = merchantRepository.getMerchant(merchantId);

        MerchantApplication merchantApplication = merchant.getMerchantApplication();

        if (Objects.isNull(merchantApplication))
            throw new ApplicationNotFoundException();

        if (merchantApplication.getApplication().getIpAddresses().size() == 1) {
            throw new IpAddressCannotBeDeleted();
        }

        IpAddress ipAddress = ipAddressRepository.getByIdAndApplication(ipAddressId, merchantApplication.getApplication());
        ipAddressRepository.delete(ipAddress);
    }

он работает нормально, когда я удаляю этот блок в методе службы;

if (merchantApplication.getApplication().getIpAddresses().size() == 1) {
            throw new IpAddressCannotBeDeleted();
        }

Но так, это не работает. Можете ли вы помочь мне, в чем проблема?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Если вы извлекаете поле сущности со свойством orphanRemoval = true в методе @Transactional, оно сохранит это поле с вашими изменениями, когда метод вернется.

В вашем случае вы извлекаете

merchantApplication.getApplication().getIpAddresses()

Но вы ничего не изменили, тогда извлеченный список был сохранен как есть.

Вы можете удалить из списка выбранных элементов то, что хотите удалить.

0 голосов
/ 20 сентября 2018

вы программно генерируете исключение в следующем коде:

 if (merchantApplication.getApplication().getIpAddresses().size() == 1) 
 {
     throw new IpAddressCannotBeDeleted();
 }

по умолчанию транзакции откатываются, если в методе, который не обрабатывается, возникает исключение времени выполнения (try ... catch).Ваш IpAddressCannotBeDeleted класс расширяется RuntimeException?Если это так, попробуйте добавить следующий атрибут в аннотацию @Transactional:

 @Transactional(noRollbackFor={IpAddressCannotBeDeleted.class, ApplicationNotFoundException.class})

Атрибут `noRollbackFor´ не позволяет Spring откатывать транзакцию, если в реализации вашего метода вызываются исключения этих двух типов.

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