当前位置: 首页 > 面试题库 >

使用current_session_context_class属性休眠3休眠4

广乐邦
2023-03-14
问题内容

我有一个Spring和Hibernate3在生产中运行良好的应用程序。以下是Spring的applicationContext.xml中会话工厂的配置

       <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingDirectoryLocations">
        <list>
            <value>classpath:/hibernate</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect
            </prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.use_sql_comments">true</prop>
            <prop key="hibernate.max_fetch_depth">2</prop>
            <prop key="hibernate.autocommit">false</prop>
            <prop key="hibernate.current_session_context_class ">thread</prop>
                            <prop key="hibernate.generate_statistics">true</prop>
            <prop key="hibernate.jdbc.batch_size">20</prop>
        </props>
    </property>
</bean>

<bean id="txManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- the transactional advice (what 'happens'; see the <aop:advisor/> html" target="_blank">bean 
    below) -->
<tx:advice id="txAdvice" transaction-manager="txManager">
    <!-- the transactional semantics... -->
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" />
        <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
        <tx:method name="count*" propagation="SUPPORTS" read-only="true" />
        <tx:method name="validate*" propagation="SUPPORTS"
            read-only="true" />
        <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
        <tx:method name="login" propagation="SUPPORTS" read-only="true" />
    </tx:attributes>
</tx:advice>

<!-- ensure that the above transactional advice runs for any execution of 
    an operation defined by the service interfaces -->
<aop:config>
    <aop:pointcut id="projectServiceOperation"
        expression="execution(* com.service.project.IProjectService.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="projectServiceOperation" />
</aop:config>

生产正常。

现在,对于另一个项目,我们正在迁移到Hibernate4。我们使用org.springframework.orm.hibernate4。*包中的Hibernate
4的SessionFactory,TransacionManager等复制了相同的配置。但是,它开始给出异常,指出“保存没有有效的交易就无效”。经过一番搜寻后,许多人似乎都遇到了问题,一些人建议不要使用

        <prop key="hibernate.current_session_context_class ">thread</prop>

财产,它的工作。它也为我工作。我从帖子中收集到的所有少量信息都与上下文会话和干扰Spring会话管理策略的线程策略有关。但是我找不到任何具体答案。
另外,为什么它不能与Hibernate3一起使用,而不能与Hibernate4一起使用。有什么区别,什么改变了?其他所有配置都是相同的。我不是使用@Transactional,而是使用老式的XML方式。

有人可以指出我对Hibernate3和Hibernate4之间这种行为差异的清楚解释吗?


问题答案:

它取决于spring的版本,但是通常必须避免在使用Spring时弄乱该属性(除非您将JTA用于事务处理,然后才需要配置它)。

从Hibernate
3.1开始,有一种称为上下文会话的东西,并且该Hibernate提供了CurrentSessionContext接口。有几种实现方式(并且thread是的缩写ThreadLocalSessionContext)。Spring对此类的接口有自己的实现SpringSessionContext

默认情况下,Spring将该属性设置为的Springs实现CurrentSessionContext,当将此属性设置为其他值(JTA除外)时,这将破坏springs管理hibernate会话(从而管理事务)的能力。

现在,在较旧版本的spring(我还假设您还升级了Spring使其可以使用hibernate)与hibernate
3结合使用时,在获取会话方面还涉及到其他技巧(由于与旧版3.x版本的hibernate向下兼容)。这使得Spring较少依赖该属性的值。(Spring为代理创建了一个代理,SessionFactory并从根本上拦截了getSession能够管理会话的方法)。



 类似资料:
  • 问题内容: 我正在建立一对多的关系。所以,我有一个父母和一个孩子。级联属性设置为全部。 我想知道我们是否考虑以下代码: Q1)如果父级拥有该关系,如,对于父级inverse = false,那么是否会在数据库中更新子级元素? Q2)如果孩子拥有关系,如,对于父inverse = true,则是否会在数据库中更新子元素添加? Q3)在是否可以看到更新的方面,谁拥有关联关系对上述代码没有影响? 非常感

  • 问题内容: 我有问题,也许有人认为它很愚蠢。Hibernate快吗?我在系统中使用它,对数据库的查询非常多。并且性能变得警觉。和其他问题脱离当前背景。有什么更好的选择- 许多简单查询(使用单个表)还是较少一些查询的查询? 先进的坦克的Artem 问题答案: 首先,您可以做很多事情来加快Hibernate的速度。查阅这些高性能hibernate技巧文章,以全面了解可以采取哪些措施来加快数据访问层的速

  • 问题内容: 我在映射类的嵌入式属性时遇到麻烦。我创建了一些类,这些类与我试图说明的类相似。基本上,我有一个使用继承的@Embeddable类层次结构。顶级类“零件号”仅具有一个属性,扩展类未向“零件号”类添加任何属性,它们仅添加了一些验证/逻辑。 这是我的意思: 部分 零件号 福特PARTNUMBER 高贵的零件编号 当然这是行不通的,因为Hibernate忽略了继承层次结构,并且不喜欢PartN

  • 问题内容: 我们将Java blazeedshibernate与flex项目集成在一起。首先,我们在eclipse中测试了纯Javahibernate,并且执行良好。但是,当我们将相同的东西放入tomcat中进行火焰集成时,它会显示以下错误,这是唯一的错误。 这是hibernate.cfg.xml(要识别是否未找到hibernate.cfg.xml,我通过删除.cfg.xml的DOCTYPE进行测

  • 问题内容: 我正在寻找展示如何将MongoDB与Hibernate集成的资源(最好是在Spring内),以便我可以在RDBMS和NoSql替代品之间进行切换:有人有这样做的经验吗? 问题答案: 您不能轻易做到这一点。Hibernate的重点是将Java对象映射到关系数据库。尽管Hibernate提取了许多细节,但您仍然需要了解关系数据库如何与诸如外键和主键之类的东西一起工作,以及运行查询对性能的影

  • 问题内容: 这是一个Hibnerate多态性问题和一个数据模型设计问题。他们交织在一起。过去我曾经使用过Hibernate,并且很喜欢它,但是有时候我发现很难想到除了琐碎的设计之外的任何事情。不能敲打hibernate;只是观察到ORM通常可能具有挑战性。 我认为这是一个Hibernate 101问题,但我不确定。我试图实现的目标甚至不可能。 我有一个抽象类Fruit,它将被分为Apple和Ora