java – 了解Spring中的SessionFactory
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 了解Spring中的SessionFactory,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2721字,纯文字阅读大概需要4分钟。
内容图文
一点背景:我正在使用Spring和Hibernate来创建一个非常简单的域/ dao /服务结构.我也在使用Autowiring将我所有的豆子注入他们快乐的地方.
在重构时,我最近得到了一个非常流行的错误消息“无法初始化代理 – 没有会话”,当我试图访问我的hibernate对象上的FetchType.LAZY属性时.它是这样的:
public class Person {
...
@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
@JoinColumn(name = "pet_id", nullable = false)
public Pet getPet() {
return pet;
}
...
}
我曾经有一个访问Pet属性的PersonService bean,并且没有遇到任何麻烦.但是,我最近重构了代码,以便PersonH??elper查看它而不是查看Pet的PersonService.虽然我的帮助bean可以看到PersonDao,可以打电话来获取该人,但是当我的会话关闭时它无法访问Pet.
所以,我认为我不清楚何时松开我的休眠会话.所有的配置看起来都很好,DAO正在注入我的助手,就像以前注入我的服务一样.我不确定为什么我的服务可以让宠物好,但我的助手不能.
理解这个“SessionFactory之谜”的任何帮助都非常感谢.我意识到这可能是一个复杂的主题,所以链接到一些好的阅读材料会摇滚.
我已经将代码更改为FetchType.EAGER(工作正常),但这个谜语在我的大脑中燃烧了一个整体:).
根据请求,这是我的配置的(简化)外观:
<bean id="personSvc" class="org.comp.service.impl.PersonServiceImpl" />
<bean id="personHelper" class="org.comp.service.helper.PersonHelper" />
<bean id="personDao" class="org.comp.dao.hibernate.HibPersonDaoImpl">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
...
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="packagesToScan" value="org.comp.domain"/>
<property name="schemaUpdate" value="true" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider
</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">/hibernate-ehcache.xml</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
DAO自动装入帮助程序:
@Autowired
private PersonDao personDao;
解决方法:
在没有看到PersonService的代码/上下文配置的情况下,我只能猜测它在重构之前的工作原理.如果您使用HibernateInterceptor围绕DAO方法包装会话管理,则会在方法完成后立即关闭会话,除非事先打开(例如OpenSessionInViewFilter).
我的猜测是在重构期间HibernateInterceptor的范围可能已经改变,因此会话现在在获取数据后立即关闭.您可能希望扩展HibernateInterceptor的范围以覆盖您的服务/业务方法,以便会话保持足够长的时间以便延迟提取工作,或者使用OpenSessionInViewFilter,这可确保会话始终可用.
内容总结
以上是互联网集市为您收集整理的java – 了解Spring中的SessionFactory全部内容,希望文章能够帮你解决java – 了解Spring中的SessionFactory所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。