当前位置: 首页 > 知识库问答 >
问题:

集成Spring JPA数据和Spring Cache时的奇怪行为

寿和通
2023-03-14

当我集成Spring JPA数据和Spring缓存时,有一种奇怪的行为我无法解释。

我正在使用Spring Boot来设置我的演示项目。代码在下面。

我的配置bean

@Configuration
public class AppConfig {

    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("Person");
    }
}

我的实体豆。

@Entity
public class Person implements Serializable {

    private static final long serialVersionUID = 2263555241909370718L;

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
public interface PersonRepository extends JpaRepository<Person, Long> {

    @Override
    @CacheEvict(value = "Person", allEntries = true)
    public void delete(Long id);

    @Cacheable("Person")
    public Person findByName(String name);

    @Override
    @Query("select p from Person p where p.id = :id + 1L")
    @Cacheable("Person")
    public Person findOne(@Param("id") Long id);
}

我的单元测试类

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = SpringDataDemoApplication.class)
public class SpringDataDemoApplicationTests {

    @Autowired
    private PersonRepository personRepository;

    @Autowired
    private CacheManager cacheManager;

    @Before
    public void setup() {
        Person p1 = new Person();
        p1.setName("Chris");
        personRepository.save(p1);
    }

    @Test
    public void test2() {

        JpaRepository<Person, Long> jpaRepository = personRepository;

        Person p = personRepository.findOne(0L);
        Assert.assertNotNull(p);

        p = personRepository.findOne(0L);
        Assert.assertNotNull(p);

        System.err.println("---------------------------------------");

        p = jpaRepository.findOne(0L);
        Assert.assertNotNull(p);

        p = jpaRepository.findOne(0L);
        Assert.assertNotNull(p);
    }

}

输出很奇怪。

Hibernate: insert into person (id, name) values (default, ?)
Hibernate: select person0_.id as id1_0_, person0_.name as name2_0_ from person person0_ where person0_.id=?+1
---------------------------------------
Hibernate: select person0_.id as id1_0_, person0_.name as name2_0_ from person person0_ where person0_.id=?+1
Hibernate: select person0_.id as id1_0_, person0_.name as name2_0_ from person person0_ where person0_.id=?+1

它应该只为我的期望打印出一条sql语句。jparepository.findone(0L)不使用缓存对象。

我还注意到@query注释工作得很好。JpaRepository和PersonRepository引用都使用定制的SQL。

我想Spring Cache和Spring JPA数据生成代理顾问的方式可能有些不同。这有可能是窃听器吗?

共有1个答案

秋博容
2023-03-14

@enablecaching添加到您的配置:

@EnableCaching
@Configuration
public class AppConfig {

    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("Person");
    }
}

声明缓存批注本身不会自动触发它们的操作,您应该使用enablecaching批注以声明方式启用caching行为。这种方法的优点之一是,您可以通过只删除一个配置行而不是代码中的所有注释来禁用它。

 类似资料:
  • 当标题[currSlotNo]的值为空时,该行将导致错误: } HomeVu1.VdslotService updVideoSlotData pictureInst:331 Picid[currSlotNo]:331 HomeVu1.VdslotService updVideoSlotData Picmk:331 HomeVu1.VdslotService updVideoSlotData aud

  • 我调用下面的方法来计算一些值。我提供agencyID和月份的整数表示来执行计算。 等等...直到我到达12月(值12)。然而,当我到达5月(月值5)时,代码给出了一个运行时错误。然而,奇怪的是这个错误被抛出 在我的查询中,我没有在查询中的任何位置包含shift\u dayId,如下所示: 我恳请帮助我确定为什么givenMonth在值大于4时抛出运行时异常。 谢谢你 编辑 这是我要求的ShiftD

  • 我正在处理NLP问题,正在使用PyTorch。由于某些原因,我的数据加载器返回了格式错误的批。我有由句子和整数标签组成的输入数据。这些句子可以是句子列表,也可以是标记列表。稍后我将在下游组件中将标记转换为整数。 我创建了以下自定义数据集: 当我以句子列表的形式提供输入时,数据加载器正确地返回成批完整的句子。请注意,: 批次正确地包含两句话和两个标签,因为。 然而,当我将句子作为标记列表的预标记列表

  • 问题内容: 我正在实施一个非常简单的易感性感染恢复模型,该模型具有稳定的工作量,可以用于闲置的副项目- 通常是一项非常琐碎的任务。但是我遇到了使用PysCeS或SciPy的求解器错误,它们都使用lsoda作为其基础求解器。这仅在参数的特定值时发生,我为之困惑。我使用的代码如下: 这将产生以下错误: 通常,当我遇到这样的问题时,我设置的方程组最终有问题,但是我都看不到任何问题。奇怪的是,如果将mu更

  • 我正在使用Mapstruct映射将一个POJO转换为另一个POJO模型 以下是mapstruct自动生成的方法 该方法基本上获取源POJO的映射,并将其转换为目标模型的映射。生成正在通过。 当我运行代码时,我在这个方法中得到了ClassCast异常:HeaderAttributeGenericDataTypeMaptoStringEnergiectAttributeDataMap 堆栈跟踪: 我还

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方