首页 > 解决方案 > 我的 JPA 存储库请求正在返回缓存,而我没有在 Spring Boot 中启用它

问题描述

我需要帮助,因为我正在按顺序执行 3 个查询,但是 Spring 和 JPA 正在对不同的对象应用缓存

子对象建立在内存中返回相同,但在每个对象“食物、药物和配件”中,我必须对该子对象进行不同的更改,但是当我更改它时,似乎建立作为参考,即是,我将其更改为 a 并复制到其他人中。

Establishment  obj = establishmentService.findById(id);

List<EstablishmentProduct> food        = repo.findByEstablishmentAndProductSegment(obj, SegmentEnum.FOOD.getCod());
List<EstablishmentProduct> medication  = repo.findByEstablishmentAndProductSegment(obj, SegmentEnum.MEDICATION.getCod());
List<EstablishmentProduct> accessories = repo.findByEstablishmentAndProductSegment(obj, SegmentEnum.ACCESSORIES.getCod());

我的实体

@Entity
public class EstablishmentProduct implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    
    private String  description;
    private Integer status;
    private Integer quantity;
    private Double  value;
    private Integer productSegment;
    private boolean deleted = false;
    
    @ManyToOne(cascade = CascadeType.DETACH)
    @JoinColumn(name = "product_id")
    private Product product;
    
    @JsonIgnore
    @ManyToOne()
    @JoinColumn(name = "establishment_id")
    private Establishment establishment;
@Repository
public interface EstablishmentProductRepository extends JpaRepository<EstablishmentProduct, Integer> {
    
    List<EstablishmentProduct> findByEstablishmentAndProductSegment(Establishment establishment, Integer productSegment);

伙计们,尽管查询是由实体进行的,但已经通过机构 ID 进行了测试,并返回了实体机构子类的相同指针

建立 obj = 建立服务.findById(id);

在我看来,Spring 和 JPA 正在应用我没有请求的缓存,我希望对于每个findByEstablishmentAndProductSegment ne 它都会返回新的子对象,而没有缓存。

我已经以各种方式禁用了缓存,但没有任何效果。

我知道Establishment 对象不会改变,但Product 对象会改变,但正如我所提到的,我需要对返回的每个段的information 进行更改

你能帮助我吗 ?

标签: javaspring-boothibernatejpaspring-data-jpa

解决方案


您正在看到无法禁用的 JPA 一级缓存的效果。但是您可以从 中驱逐一些或所有实体,EntityManager或者启动一个新会话,该会话将从一个空缓存开始。


推荐阅读