Java 休眠加载策略
我们在SpringMVC应用程序中使用OpenSessionView。我不知道如何最好地处理这种情况。主要是因为我对Hibernate不太熟悉。我们有两个对象,分别为我们查看的每个页面加载。让我们假设我们正在开发CMS。因此,我们必须加载每个页面上登录的人,以及他们当前正在使用的站点。在正常的操作过程中,这些数据实际上都没有变化 我们有一个自定义拦截器,基本上如下所示:Java 休眠加载策略,java,hibernate,spring,Java,Hibernate,Spring,我们在SpringMVC应用程序中使用OpenSessionView。我不知道如何最好地处理这种情况。主要是因为我对Hibernate不太熟悉。我们有两个对象,分别为我们查看的每个页面加载。让我们假设我们正在开发CMS。因此,我们必须加载每个页面上登录的人,以及他们当前正在使用的站点。在正常的操作过程中,这些数据实际上都没有变化 我们有一个自定义拦截器,基本上如下所示: public class PersistenceInterceptor implements HandlerIntercept
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关系导航时,也会使用该缓存。如果查询使用查询缓存,则第二级缓存也用于加载查询结果。最后,保存实体时缓存不会失效,它只是更新而已。阅读