Нарушено уникальное ограничение на замену элемента из списка в тесте - PullRequest
0 голосов
/ 04 июля 2019

Итак, у меня есть клиент = кредитор, у которого есть список документов. Этот список может содержать только один тип каждого документа, поэтому у меня есть метод 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 -> existingDocument.getType() == newDocument.getType());
    documents.add(newDocument);
}

лицо:

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "creditor_id")
@Builder.Default
private List<Document> documents = new ArrayList<>();

Забавно, что когда я удаляю уникальное ограничение из пролетного пути, тест проходит успешно, поэтому кажется, что проблемы с транзакцией.

1 Ответ

0 голосов
/ 09 июля 2019

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

Также прочитайте пост Влада о порядке: Руководство для начинающих по порядку операций сброса Hibernate .Вы также можете прочитать код класса EventListenerRegistryImpl и посмотреть, как выглядит порядок.

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