![](/img/trans.png)
[英]Testing lazy loading in hibernate (java spring with transactions)
[英]Spring transactions & hibernate: lazy initialization
从到目前为止的阅读中,我了解到使用事务将是休眠休眠加载问题的解决方案。 该会话将在服务层的整个事务过程中可用,而没有其他建议。
因此,也许我没有正确配置事务管理? 在春季和冬季,我实际上是一个新手,但是也许你们可以帮我一下。
我的配置:
<bean class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
id="sessionFactory">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- Hibernate Template bean that will be assigned to DAOs. -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!--
Transaction manager for a single Hibernate SessionFactory (alternative
to JTA)
-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
我的DAO实现将只具有@Repository
批注和使用自动装配注入的Hibernate-template
bean。
服务实现的典型标头为:
@Service
@Transactional(readOnly=true)
public class LeerlingServiceImpl implements LeerlingService {
@Autowired
LeerlingDAO leerlingDAO;
@Autowired
LeerplanDAO leerplanDAO;
如果在该特定方法中实际保存/更新了任何内容,则使用@Service(readOnly=false)
批注。
我是否需要配置其他内容以确保可以在我的服务中加载正确的关联,还是通常由事务处理?
现在,我对应该实际执行的操作感到有些困惑,所以请帮助我:)
延迟加载问题和事务之间并没有真正的关联。 但这是另一个故事:)除了可以访问bean中的会话之外,您还做得很好。 不确定您将如何执行此操作。 标准解决方案(在Spring 2.x中,尚不确定3.x,尚未使用)是将HibernateDaoSupport用作要访问会话的类的基类。 但是就我个人而言,这对我来说似乎有点狡猾,因为增加了对特定于Spring的类的依赖。 更好的方法是将会话注入到bean中。 为此,您需要声明您的会话bean,其定义类似于该bean:
<bean name="hibernateSession" class="org.springframework.orm.hibernate3.SessionFactoryUtils" factory-method="getSession"
scope="prototype">
<constructor-arg index="0" ref="hibernateSessionFactory"/>
<constructor-arg index="1" value="false"/>
<aop:scoped-proxy/>
</bean>
然后使用它。
这是详细信息:
http://stas-blogspot.blogspot.com/2009/10/hibernate-spring-in-standalone.html
我认为到目前为止我对Spring的了解还很糟糕。 实际上,我们的会话管理没有真正的管理。 基本上现在发生的是:您可以从DAO中获取数据,但是在收到数据之后,由于会话已关闭,您甚至无法加载惰性集合。
现在我们使用休眠拦截器,它在每个请求的开始将会话附加到线程,并在结束时将其关闭。 这并不总是最理想的解决方案,但是对于一个学校项目,我不会太在意。
另一个解决方案似乎是:以@around
的方式添加AOP,以使会话仅在服务方法调用期间可用。 我认为这是最好的解决方案,但是,对于该项目,我现在不会对此进行深入探讨。 好消息是我知道它的存在。
这篇文章对我也有很大帮助: http : //www.jroller.com/kbaum/entry/orm_lazy_initialization_with_dao
对于那些感兴趣的人:这是我必须添加的内容:在Spring MVC 3.0中,有一个名为mvc:intereceptors
的新功能,使我键入的xml更少。
<!-- WEB-INF/applicationContext.xml or your own XML config file -->
<mvc:interceptors>
<bean
class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
</mvc:interceptors>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.