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 C#读写EXCEL文件,不同编译
  • ¥15 如何提取csv文件中需要的列,将其整合为一篇完整文档,并进行jieba分词(语言-python)
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置