从我到目前为止阅读的内容据我所知,我了解使用交易将是解决休眠的懒惰加载问题的解决方案。该会话将在服务层的整个交易期间可用,而无需进一步的ADUE。

所以也许我对交易管理错误进行了错误配置?在春季和冬眠方面,我实际上是一个新手,但也许你们可以帮助我。

我的配置:

<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 使用自动释放注射豆。

服务实施的典型标题是:

@Service
@Transactional(readOnly=true)
public class LeerlingServiceImpl implements LeerlingService {

    @Autowired
    LeerlingDAO leerlingDAO;
    @Autowired
    LeerplanDAO leerplanDAO;

@Service(readOnly=false) 注释如果实际上保存/更新了任何特定方法。

我是否需要配置其他内容以确保我可以在服务中加载正确的关联,或者通常通过交易来处理?

现在,我对我应该真正做的事情有些困惑,所以请帮助我:)

有帮助吗?

解决方案

懒惰的问题和交易并不是与另一个相关的。但这是另一个故事:)除了在豆类中访问会话外,您还做得很好。不确定您将如何做到这一点。标准解决方案(在春季2.x,不确定3.x,尚未看)是使用HibernatedAosupport作为课堂课程,如果您将可以访问会话。但是就我个人而言,这对我来说有点狡猾,因为增加了对特定春季的班级的依赖。更好的方法是将会话注入您的豆子。为此,您需要以类似于该的定义声明您的会话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-andandalone.html

其他提示

我认为我对春天的理解直到现在很糟糕。我们的会议管理确实没有真正的管理。基本上,现在发生的事情是:您可以从DAO中获取数据,但是在收到它之后,您甚至无法加载懒惰的收藏,因为会话已关闭。

现在,我们正在使用Hibernate Interceptor,该截距器将会话连接到每个请求的开头的线程,并在结束时将其关闭。这并不总是最理想的解决方案,但是对于学校项目,我不会太多。

另一个解决方案似乎是:以某种方式添加AOP @around 使用该会话仅在服务方法调用期间可用。我认为这是最好的解决方案,但是,我现在不会为此项目深入研究。好事是我知道它存在。

本文也对我有很大帮助: http://www.jroller.com/kbaum/entry/entry/orm_lazy_initialization_with_dao

感兴趣的人:这是我必须添加的:在春季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归因
不隶属于 StackOverflow
scroll top