【问题标题】:JpaRepository saves more than one entityJpaRepository 保存多个实体
【发布时间】:2020-07-19 19:13:57
【问题描述】:

tnxRepository 正在扩展 JpaRepository,为什么我只保存一个实体时两个实体都被保存了? CrudRepository 只保存目标一个。

Tnx tnx = tnxRepository.findById(id);
tnx.txt = txt;
Tnx tnx2 = tnxRepository.findById(2);
tnx2.txt = txt;
tnxRepository.save(tnx);

【问题讨论】:

    标签: java jpa spring-data-jpa


    【解决方案1】:

    JpaRepository 将您的存储库与 JPA 持久性技术联系起来,因此在 save() 上,两个对象都会被持久化。此外,JpaRepository 扩展了 CrudRepository,因此它提供了 CrudRepository 提供的所有功能等等。

    CrudRepository 是提供 CRUD 操作的基本接口。因此,并不是所有的对象都会被持久化,而只有你保存的那个。

    【讨论】:

    • 从 CrudRepository 继承的保存方法,行为应该相同。
    • 在 JpaRepository 中实现它的方式发生了变化,因为 JpaRepository 实现了除 CrudRepository 之外的其他接口,如 PagingAndRepository 和 Repository。这就是 OOPS 的魔力!
    【解决方案2】:

    因为对于持久实体,hibernate 会自动检测它的变化并更新数据库。即使您不保存最后一个,两个实体也会更新。

    【讨论】:

    • 我可以理解所有实体都会被更新,但是JpaRepository继承了CurdRepository的save方法,而且它们的行为不同,所以很奇怪。
    • 它们都来自SimpleJPARepository,最后调用了entityManager。就像@eklavya 说的那样,如果您有@Transactional 注释,则不需要tnxRepository.save,因为hibernate 正在跟踪事务中获取的每个对象以进行任何更新
    【解决方案3】:

    参见saveAll 方法。

    例如。

    Tnx tnx = tnxRepository.findById(id);
    tnx.txt = txt;
    Tnx tnx2 = tnxRepository.findById(2);
    tnx2.txt = txt;
    tnxRepository.saveAll(List.of(tnx, tnx2))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 2019-11-04
      • 1970-01-01
      相关资源
      最近更新 更多