首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring数据JPA无法理解的工作逻辑

问Spring数据JPA无法理解的工作逻辑
EN

Stack Overflow用户
提问于 2018-07-31 12:32:00
回答 1查看 44关注 0票数 0

在使用过程中,我有这样的方法:

代码语言:javascript
复制
@Transactional
public void CatalogRequest(CatalogDto catalogDto) {

  updateCatalog(catalogDto);

}

在此方法中,使用@Transactional注解,内部私有方法

代码语言:javascript
复制
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);
  }

在我的例子中,我有目录活动,我等待下一个逻辑:

  1. catalogsRepository.findByGuigAndIsActive查找活动目录
  2. if (catalog != null) -真
  3. 我设置了active false并保存目录 Catalog.setIsActive(假);catalogsRepository.save(目录);
  4. 从dto创建新的目录,并以活动的true状态保存它。

但是我得到了SQLIntegrityConstraintViolationException,因为我有约束:

代码语言:javascript
复制
create unique index CATALOG_UN1
    on CATALOGS (CASE "IS_ACTIVE" WHEN 1 THEN "GUIG" WHEN 0 THEN NULL END)

我正在等待旧目录更改状态为非活动目录、更新目录和具有活动状态的新目录插入。在交易中

代码语言:javascript
复制
begin transaction
oldCatalog.setActive(true)
update oldCatalog
create new catalog with active true
insert new catalog
commit

但是,看起来事务的工作方式有所不同,或者我不明白什么。当我尝试插入带有活动状态的新目录时,JPA认为旧的活动状态也是正确的,并抛出SQLIntegrityConstraintViolationException。我就这样解决这个问题:

代码语言:javascript
复制
if (catalog != null) {
    catalog.setIsActive(false);
    catalogsRepository.saveAndFlush(catalog);
}

但是我不明白我是否做了正确的事情,为什么简单的save()不起作用。

EN

回答 1

Stack Overflow用户

发布于 2018-07-31 13:10:50

当您保存Managed Entity (这意味着要更新Hibernate从数据库中获取的实体)时,Hibernate在尝试提交Transaction之前不会向数据库发送update查询。因此,在您的情况下,如果您不强制Hibernate首先发送更新查询,那么在更新查询之前,您的create查询将被发送到数据库,并且数据库将发现一个约束冲突。这就是为什么JDBC Driver抛出异常的原因。

但是,当使用saveAndFlush时,强制Hibernate将缓存在其缓冲区中的所有查询发送到数据库,因此当您保存新实体时,创建查询将在更新查询后发送到数据库。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51613486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档