gpt4 book ai didi

java - 了解 Spring 中的 SessionFactory

转载 作者:搜寻专家 更新时间:2023-11-01 02:55:01 55 4
gpt4 key购买 nike

一些背景知识:我正在使用 Spring 和 Hibernate 创建一个非常简单的域/dao/服务结构。我还使用 Autowiring 将我所有的 bean 注入(inject)到它们快乐的地方。

在重构时,我最近在尝试访问我的 hibernate 对象上的 FetchType.LAZY 属性时收到非常流行的错误消息“无法初始化代理 - 无 session ”。它是这样的:

public class Person {

...

@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
@JoinColumn(name = "pet_id", nullable = false)
public Pet getPet() {
return pet;
}
...
}

我曾经有一个访问 Pet 属性的 PersonService bean,这样做没有任何问题。但是,我最近重构了代码,而不是 PersonService 查看 Pet,而是 PersonH​​elper 查看它。虽然我的助手 bean 可以看到 PersonDao,可以调用这个人,但它无法访问 Pet,因为我的 session 已关闭。

因此,我认为我不清楚我何时会松开我的 hibernate session 。所有的配置看起来都很好,DAO 被注入(inject)到我的助手中,就像它过去被注入(inject)到我的服务中一样。我不确定为什么我的服务可以很好地获取宠物,但我的助手却不能。

非常感谢任何帮助理解这个“SessionFactory 之谜”的人。我意识到这可能是一个复杂的主题,因此指向一些好的阅读 Material 的链接会很好。

我已经将代码更改为 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 方法进行 session 管理,然后 session 在方法完成后立即关闭,除非它事先打开(例如通过 OpenSessionInViewFilter )。

我的猜测是 HibernateInterceptor 的范围可能在重构过程中发生了变化,因此 session 现在会在获取数据后立即关闭。您可能需要考虑扩展 HibernateInterceptor 的范围以涵盖您的服务/业务方法,以便 session 保持足够长的时间以便延迟获取工作,或者使用 OpenSessionInViewFilter,它确保 session 始终可用。

关于java - 了解 Spring 中的 SessionFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3276720/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com