我在一个请求中保存和检索数据库中的对象时遇到问题。 我想清除hibernate会话的缓存,以便在我们的数据库中获取更新的实体。 我的代码如下所示:
public class SampleController{
protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
throws Exception {
myServiceOne.doAllotsOfSaving(parameters);
//some code enhancements to remove cache in hibernate session
//without affecting the session of other user logged in.
//some fields in MyEntity class contains the old values but the actual data in database is already updated
MyEntity entity = myServiceTwo.getMyEntityByOrderNo(orderNo);
}
}
--configurations
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="hibernateProperties">
<ref local="hibernateProperties"/>
</property>
<property name="entityInterceptor">
<ref bean="auditLogInterceptor" />
</property>
</bean>
<bean id="myServiceOne" class="com.test.service.impl.MyServiceOneImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="myServiceTwo" class="com.test.service.impl.MyServiceTwoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
--configurations
答案 0 :(得分:1)
Session factory
是一个长期multithreaded
对象。
通常一个session factory should be created for one database
。
Session
用于获取与数据库的物理连接。 Session
对象是轻量级的,旨在每次与数据库进行交互时进行实例化。
Session
的主要功能是为映射实体类的实例提供CRUD
操作。在给定的时间点,实例可能存在以下三种状态之一:
transient :aa持久化类的新实例,它与Session
无关,并且在数据库中没有任何表示,并且transient
不会将Hibernate
视为{ {1}}。
持久性:您可以通过将临时实例与Session
相关联来使其持久化。 persistent
实例在数据库中有一个表示,一个标识符值,并与Session
相关联。
分离:关闭Hibernate
会话后,持久化实例将成为detached
个实例。
答案 1 :(得分:1)
java web应用程序是否只包含一个hibernate会话以及如何清除此hibernate会话?
任何基于hibernate的应用程序都不能使用多个会话。必须在执行任务时关闭其中的每个会话。如果在hibernate的配置文件中配置相同的Hibernate,可以为您管理会话。 但是,每个应用程序只应有一个SessionFactory个实例。
要清除会话,您可以调用session.clear()方法。它清除会话级缓存。
,不会影响其他用户登录的会话
由于您有一个Web应用程序,因此每个用户都有一个不同的线程用于数据库事务。这意味着每个用户将拥有不同的休眠会话,因此您不必担心这一点。如果通过某些方式你为所有用户使用相同的会话,那么你做错了,结果可能是灾难性的。一段时间后,由于会话级缓存,您将获得OutOfMemoryError
。
您必须注意,您无法禁用hibernate会话级缓存。为此,您可以使用StatelessSession。