от
Итак, у меня есть клиент = кредитор, у которого есть список документов. Этот список может содержать только один тип каждого документа, поэтому у меня есть метод add document, который добавляет новую документацию, но если документ такого типа уже существует, его следует заменить. этот тест не пройден по уникальному ограничению
def "should replace documents with same type"() {
    given:
        def creditor = creditors.create(CreditorHelper.createSampleCreditorForm())
        def documentType = DocumentTypeEvent.INVESTMENT_INSTRUCTION
    and:
        def old = documents.addDocument(new DocumentForm("urlOld", creditor.creditorReference, documentType, ZonedDateTime.now()))

    when:
        documents.addDocument(new DocumentForm("urlNew", creditor.creditorReference, documentType, ZonedDateTime.now()))

    then:
        def newResult = documentRepository.findByCreditorReference(creditor.creditorReference)
        newResult.size() == 1
        newResult.find {
            it.url == "urlNew"
        }
    and:
        documentRepository.findByHash(old.hash) == Optional.empty()
}
Реализация проста заменить:
@Transactional
public Document addDocument(final DocumentForm documentForm) {
    return creditorRepository.findByCreditorReferenceIgnoreCase(documentForm.getCreditorReference())
        .addDocument(new Document(documentForm));
}
выше звонки:
 public Document addDocument(Document newDocument) {
    documents.removeIf(existingDocument 

юридическое лицо:

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "creditor_id")
@Builder.Default
private List documents = new ArrayList<>();
Забавно, что когда я удаляю уникальное ограничение из пролетного пути, тест проходит успешно, так что, похоже, проблемы с транзакцией.              

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

1 Ответ

0 голосов
от
Я думаю, что это может быть связано с упорядочением запросов Hibernate во время сброса. Поскольку сохранение новых сущностей вызывается в качестве первой операции сеансом Hibernate, вы получаете исключение, так как сущность присутствует в БД во время сброса. Включите опцию
show_sql
в Hibernate и попробуйте просмотреть журналы, каков реальный порядок запросов, отправляемых в БД. Также прочитайте сообщение Влада о порядке: руководство для начинающих по порядку выполнения Hibernate. Вы также можете прочитать код класса
EventListenerRegistryImpl
и посмотреть, как выглядит порядок.     
...