Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 休眠加载策略_Java_Hibernate_Spring - Fatal编程技术网

Java 休眠加载策略

Java 休眠加载策略,java,hibernate,spring,Java,Hibernate,Spring,我们在SpringMVC应用程序中使用OpenSessionView。我不知道如何最好地处理这种情况。主要是因为我对Hibernate不太熟悉。我们有两个对象,分别为我们查看的每个页面加载。让我们假设我们正在开发CMS。因此,我们必须加载每个页面上登录的人,以及他们当前正在使用的站点。在正常的操作过程中,这些数据实际上都没有变化 我们有一个自定义拦截器,基本上如下所示: public class PersistenceInterceptor implements HandlerIntercept

我们在SpringMVC应用程序中使用OpenSessionView。我不知道如何最好地处理这种情况。主要是因为我对Hibernate不太熟悉。我们有两个对象,分别为我们查看的每个页面加载。让我们假设我们正在开发CMS。因此,我们必须加载每个页面上登录的人,以及他们当前正在使用的站点。在正常的操作过程中,这些数据实际上都没有变化

我们有一个自定义拦截器,基本上如下所示:

public class PersistenceInterceptor implements HandlerInterceptor {
    private PlatformTransactionManager transactionManager; //from spring
    private TransactionStatus transactionStatus;

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        this.transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
        if (handler instanceof SpecialInterface) {
           handler.setPerson(loadPersonByKey(session.getAttribute(PERSON_KEY)));
           handler.setSite(loadSiteByKey(session.getAttribute(SITE_KEY)));
        }
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //Wrapped in try catch & rolled back if unable to commit
        transactionManager.commit(transactionStatus);
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

        if (ex != null && !transactionStatus.isCompleted()) {
            transactionManager.rollback(transactionStatus);
        }
    }
对我们来说,最好的做法是修改我们正在进行的工作,然后稍微修改一下,使用我们配置的Hibernate sessionFactory来获取会话,然后更新person&site,还是我们仍然在加载这些值


显然,这些查询并没有那么重,但是有时候,保存一些更重的东西并从数据库中卸载工作会很有用。

如果您的目标是从数据库中卸载工作,那么您应该考虑使用二级缓存。由于同一个人和站点经常被读取,很少被更新,因此这些实体的二级缓存非常适合,并将有效减少这些实体的加载次数,而无需更改代码中的任何内容


请参见

如果您的目标是从数据库中卸载工作,那么您应该考虑使用二级缓存。由于同一个人和站点经常被读取,很少被更新,因此这些实体的二级缓存非常适合,并将有效减少这些实体的加载次数,而无需更改代码中的任何内容


请参见

正如我记得的那样,hibernate将使用二级缓存,前提是您根据实体的id和Session.get(id)方法加载实体!并且,如果更新并保存某个实体类型(相同类型的所有实体)的其中一个实体,则该实体类型的缓存将无效。@Ralph:在通过ToOne关系导航时,以及在缓存关联时,在通过ToMany关系导航时,也会使用该缓存。如果查询使用查询缓存,则第二级缓存也用于加载查询结果。最后,保存实体时缓存不会失效,它只是更新而已。正如我记得的那样,hibernate将使用二级缓存,前提是您通过实体的id和Session.get(id)方法加载实体!并且,如果更新并保存某个实体类型(相同类型的所有实体)的其中一个实体,则该实体类型的缓存将无效。@Ralph:在通过ToOne关系导航时,以及在缓存关联时,在通过ToMany关系导航时,也会使用该缓存。如果查询使用查询缓存,则第二级缓存也用于加载查询结果。最后,保存实体时缓存不会失效,它只是更新而已。阅读