gpt4 book ai didi

java - 测试中列表中的替换项违反了唯一约束

转载 作者:行者123 更新时间:2023-11-28 21:37:19 27 4
gpt4 key购买 nike

所以我有 client = creditor,它有文件 list 。此列表只能包含每个文档的一种类型,因此我有添加新文档的方法添加文档,但如果已经存在这种类型的文档,则应将其替换。

此测试因唯一约束而失败

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<>();

有趣的是,当我从 flyway 测试中删除唯一约束时,它似乎是交易的问题。

最佳答案

我认为这可能与刷新期间 Hibernate 的查询排序有关。因为持久化新实体是 Hibernate session 的第一个操作,所以当实体在刷新期间存在于 DB 中时会出现异常。在 Hibernate 中打开 show_sql 选项并尝试查看日志发送到数据库的查询的真实顺序是什么。

另请阅读 Vlad 关于订购的帖子:A beginner’s guide to Hibernate flush operation order .您也可以阅读类 EventListenerRegistryImpl 的代码,并查看排序方式。

关于java - 测试中列表中的替换项违反了唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56890804/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com