在使用过程中,我有这样的方法:
@Transactional
public void CatalogRequest(CatalogDto catalogDto) {
updateCatalog(catalogDto);
}在此方法中,使用@Transactional注解,内部私有方法
private void updateCatalog(CatalogDto catalogDto) {
Catalog catalog = catalogsRepository.findByGuigAndIsActive(catalogDto.getGuid(), true);
if (catalog != null) {
catalog.setIsActive(false);
catalogsRepository.save(catalog);
}
CatalogMapper catalogMapper = new CatalogMapper(catalogDto);
Catalog newCatalog = catalogMapper.toDomain();
catalogsRepository.save(newCatalog);
}在我的例子中,我有目录活动,我等待下一个逻辑:
catalogsRepository.findByGuigAndIsActive查找活动目录if (catalog != null) -真false并保存目录
Catalog.setIsActive(假);catalogsRepository.save(目录);但是我得到了SQLIntegrityConstraintViolationException,因为我有约束:
create unique index CATALOG_UN1
on CATALOGS (CASE "IS_ACTIVE" WHEN 1 THEN "GUIG" WHEN 0 THEN NULL END)我正在等待旧目录更改状态为非活动目录、更新目录和具有活动状态的新目录插入。在交易中
begin transaction
oldCatalog.setActive(true)
update oldCatalog
create new catalog with active true
insert new catalog
commit但是,看起来事务的工作方式有所不同,或者我不明白什么。当我尝试插入带有活动状态的新目录时,JPA认为旧的活动状态也是正确的,并抛出SQLIntegrityConstraintViolationException。我就这样解决这个问题:
if (catalog != null) {
catalog.setIsActive(false);
catalogsRepository.saveAndFlush(catalog);
}但是我不明白我是否做了正确的事情,为什么简单的save()不起作用。
发布于 2018-07-31 13:10:50
当您保存Managed Entity (这意味着要更新Hibernate从数据库中获取的实体)时,Hibernate在尝试提交Transaction之前不会向数据库发送update查询。因此,在您的情况下,如果您不强制Hibernate首先发送更新查询,那么在更新查询之前,您的create查询将被发送到数据库,并且数据库将发现一个约束冲突。这就是为什么JDBC Driver抛出异常的原因。
但是,当使用saveAndFlush时,强制Hibernate将缓存在其缓冲区中的所有查询发送到数据库,因此当您保存新实体时,创建查询将在更新查询后发送到数据库。
https://stackoverflow.com/questions/51613486
复制相似问题