У меня есть следующая сущность с Ограничениями:
// 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 все равно будет зафиксирован. Но никто не должен быть передан, если один не прав. Все запросы должны откатываться. Как мне аннотировать метод или справиться с этой проблемой?