iteye_547 2008-06-17 19:01
浏览 217
已采纳

请教hibernate 连续查询问题

我对一个基表查询
A a=find("hql").get(0);
然后a.setProp(555);
然后对换一个字段查询
B b=find("ohterhql").get(0);
在第一次查询时没问题
在b的find时会将a setProp的值持久化到数据库中
这是为什么
hibernate不熟,请教各位

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.Oracle9iDialect
                </prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.cache.provider_class">
                    org.hibernate.cache.EhCacheProvider
                </prop>
                <prop key="hibernate.cache.use_query_cache">true</prop>
            </props>

        </property>
    </bean>
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>


    <!-- 支持 @Transactional 标记 -->
    <tx:annotation-driven transaction-manager="transactionManager"
        proxy-target-class="true" />

    <!-- =========== openSessionInViewInterceptor ==============-->
    <bean id="openSessionInViewInterceptor"
        class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

hibernate3.2+spring2

  • 写回答

3条回答 默认 最新

  • llade163 2008-06-17 22:54
    关注

    在那个调用了a.setProp(555); 方法的@Transactional(propagation=Propagation.XXXXXX, [color=red]readOnly=true[/color])

    加上readOnly。

    因为Hibernate有持久状态和脱管状态,持久状态就是Hibernate 的session.close之前(正确来说,是session flush或commit之前),经session 查询出来的对象都是脱管状态。参照Hibernate的文档:
    [quote]持久(Persistent) - 持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。 Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)。 开发者不需要手动执行UPDATE。将对象从持久(Persistent)状态变成瞬时(Transient)状态同样也不需要手动执行DELETE语句。[/quote]

    假设
    [code="java"]@Transactional(propagation=Propagation.XXXXXX, [color=red]readOnly=true[/color])
    public void doSomething(Object a){
    ...
    a.setProp(555);
    ...
    }[/code]
    而调用a.setProp(555)的doSomething方法有@Transactional修饰,表示此方法在spring容器包装上事务,也就是代码进入方法之前,spring会启用事务,退出方法的时候会提交事务(等于是调用了flush或者commit),这时候,虽然你没有显式的保存a,但是还是会被持久化的。发生此方法内发生异常的时候,事务则回滚(不保存)

    readOnly则表示,此方法内对持久对象修改不被保存。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog