Spring не откатывается, если со списком происходит уникальная ошибка ограничения. Как включить откат для всего списка? - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть следующая сущность с Ограничениями:


// Associated entry
@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = {"userId", "associationDate"}))
public class Association extends coreEntity {

       @Column(nullable = false)
       private Long userId;

       @Column(nullable = false)
       private LocalDate associationDate;

       @Column(nullable = false)
       private LocalTime start;

       @Column(nullable = false)
       private LocalTime end;

       private Duration breakTime;

       @Column(nullable = false)
       @OneToMany(fetch = FetchType.EAGER)
       private Set<ProjectEntry> projects;
    // getter setter

}


// the entry that causes the Problems with unique constraints
@Data
@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = {"projectId", "userId", "date"}))
public class ProjectEntry extends CoreEntity {

    @Column(nullable = false)
    private Long projectId;

    @Column(nullable = false)
    private Long userId;

    @Column(nullable = false)
    private Duration duration;

    @Column(nullable = false)
    private LocalDate anyDate;

    //getter setter

}

Метод Service Impl


@Override
@Transactional
public Association create(Association association ) {
    checkNotNull(association);
    association.setId(null);

    association.getProjects().forEach(projectEntry -> {
        checkObjectNotNull(projectEntry );
        projectEntryRepo.save(projectEntry);
    });
   // Here is the problem
}
return associationRepo.save(association);


Здесь будет выдано исключение, когда ограничение нарушено. Но если первый объект списка действителен, а второй нарушает ограничение уникальности, первый Entry-create все равно будет зафиксирован. Но никто не должен быть передан, если один не прав. Все запросы должны откатываться. Как мне аннотировать метод или справиться с этой проблемой?

Ответы [ 3 ]

0 голосов
/ 14 апреля 2020

Добавить @Valid для проверки Set<ProjectEntry>

Попробуйте обновить код, как показано ниже

@OneToMany(cascade = [CascadeType.ALL]), это сохранит ProjectEntity

Класс ассоциации

// Associated entry
@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = {"userId", "associationDate"}))
public class Association extends coreEntity {

       @Column(nullable = false)
       private Long userId;

       @Column(nullable = false)
       private LocalDate associationDate;

       @Column(nullable = false)
       private LocalTime start;

       @Column(nullable = false)
       private LocalTime end;

       private Duration breakTime;

       @Column(nullable = false)
       @Valid
       @OneToMany(cascade = [CascadeType.ALL])
       private Set<ProjectEntry> projects;
    // getter setter

}

Сервисный импл

@Override
@Transactional
public Association create(Association association ) {
    checkNotNull(association);
    association.setId(null);
    return associationRepo.save(association);
}
0 голосов
/ 15 апреля 2020

Установить autocommit в false при запуске функции и после успешной обработки всех объектов, затем зафиксировать изменения

0 голосов
/ 14 апреля 2020
    @Transactional(rollbackFor = {Exception_NAME.class,...})
    public Association create(Association association ) {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...