Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止NamedStoredProcedureRequests的hibernate 4缓存?_Java_Spring_Hibernate_Jpa 2.1 - Fatal编程技术网

Java 如何防止NamedStoredProcedureRequests的hibernate 4缓存?

Java 如何防止NamedStoredProcedureRequests的hibernate 4缓存?,java,spring,hibernate,jpa-2.1,Java,Spring,Hibernate,Jpa 2.1,我正在实现一个基于Spring3.2.8、jpa2.1和Hibernate4.3.5的web应用程序。我想知道如何防止hibernate缓存特定的命名存储过程查询 我试过entityManager.clear,但我认为它会清除所有缓存的实体值,所以它不是最佳解决方案 注意:我使用@NamedStoredProcedureQueries来定义存储过程并通过 entityManager.CreateNamedStoredProcess方法以获取结果 增加: 服务员: 表1个人价值: 视图1: 功能检

我正在实现一个基于Spring3.2.8、jpa2.1和Hibernate4.3.5的web应用程序。我想知道如何防止hibernate缓存特定的命名存储过程查询

我试过entityManager.clear,但我认为它会清除所有缓存的实体值,所以它不是最佳解决方案

注意:我使用@NamedStoredProcedureQueries来定义存储过程并通过 entityManager.CreateNamedStoredProcess方法以获取结果

增加:

服务员:

表1个人价值:

视图1:

功能检查\u值输入:

如果person_值中有一条p等于输入的记录,则返回1

存储过程SPS_视图1:

sql server视图视图1的实体类:

服务类别:

@Service("personService")
public class PersonService() {
    ...
    private EntityManager entityManager;

    <getters and setters>
    ...

    public List<View1> getAll(String pno) {
       SqlParameterValue p = new SqlParameterValue(new SqlParameter("p#", Types.VARCHAR), pno);
       StoredProcedureQuery spq = entityManager.createNamedStoredProcedureQuery("getV1Records");            
       spq.setParameter(p.getName(), p.getValue());
       return list;
    }

}
控制器类:

@Controller("PersonController")
public class PersonController {

   ...
   @Autowired
   private PersonService personService;
   ...

   @RequestMapping("/person")
   public personInfo(HttpServletRequest request) {
      String pno = request.getParameter("pno");
      ModelAndView mv = new ModelAndView("person");
      List<View1> list = personService.getAll(pno);
      mv.addObject("view1_list", list);
      return mv;
   }
   ...

}

当我第一次在我的控制器中调用带有p的getAll时,例如“p14521”,表person_value中没有p“p14521”的记录,它会正常工作,一切正常,但是当我使用p“p14521”向person_值添加一条记录时,现在有一条关于p“p14521”的记录,再次调用getAll时,输出列表将不会发生任何事情。查询的输出列表似乎已被缓存。

您可以通过指定以下提示告诉hibernate不要从缓存中提取:-

hints = { @QueryHint(name = "org.hibernate.cacheable", value = "false") },
试试这个:-

@NamedStoredProcedureQueries({
      @NamedStoredProcedureQuery(
        name="proc1",
         resultClass=.....class,
         hints = { @QueryHint(name = "org.hibernate.cacheable", value = "false") },
        procedureName="Proc1",
        parameters={...
        ),
        @NamedStoredProcedureQuery(
        name="proc2",
         resultClass=.....class,
         hints = { @QueryHint(name = "org.hibernate.cacheable", value = "false") },
        procedureName="Proc2",
        parameters={...
        ))

默认情况下,Hibernate不缓存查询结果。您必须启用二级缓存查询,并指示缓存当前正在执行的查询

Hibernate默认的一级缓存是一个实体缓存,它在加载实体时启动:find/load或HQL/Criteria查询

我认为您的存储过程结果根本不会被缓存

您的问题可能与存储过程未触发有关

在执行存储过程之前触发手动刷新:

em.flush();
另外,您没有在getAll方法中调用查询getResultList:

所以它应该是这样的:

em.flush();
return spq.getResultList();

谢谢,我以前试过,但没用。我在hibernate上没有缓存配置。根据,我认为我应该首先进行缓存配置,然后此查询提示将起作用???此查询提示将起作用,无论您是否指定了hibernate查询缓存属性,这意味着使用此查询提示,hibernate必须始终对数据库执行查询。您是如何确定它不起作用的?谢谢,但我确信数据已被缓存,因为当我清除entityManager时,列表将被更新。请检查我更新的答案。这可能与自动刷新模式有关。在调用存储过程之前触发手动刷新。您是在spring控制器中还是在服务层中使用@TransactionalreadOnly=true?在上述代码中,您是否检查了spq参数设置是否正确?如果可能,请提供更多关于如何从控制器调用以及如何在getAllNo中填充列表的详细信息。我没有使用@TransactionalreadOnly=true。我在问题中添加了控制器类代码。
@Controller("PersonController")
public class PersonController {

   ...
   @Autowired
   private PersonService personService;
   ...

   @RequestMapping("/person")
   public personInfo(HttpServletRequest request) {
      String pno = request.getParameter("pno");
      ModelAndView mv = new ModelAndView("person");
      List<View1> list = personService.getAll(pno);
      mv.addObject("view1_list", list);
      return mv;
   }
   ...

}
hints = { @QueryHint(name = "org.hibernate.cacheable", value = "false") },
@NamedStoredProcedureQueries({
      @NamedStoredProcedureQuery(
        name="proc1",
         resultClass=.....class,
         hints = { @QueryHint(name = "org.hibernate.cacheable", value = "false") },
        procedureName="Proc1",
        parameters={...
        ),
        @NamedStoredProcedureQuery(
        name="proc2",
         resultClass=.....class,
         hints = { @QueryHint(name = "org.hibernate.cacheable", value = "false") },
        procedureName="Proc2",
        parameters={...
        ))
em.flush();
em.flush();
return spq.getResultList();