Eclipse自动生成的Hibernater的DAO类该怎么用过对啊?
为什么我每次使用DAO来更新或插入数据后,再对其进行查询,总是会出现被更新的数据有时显示已经更新,有时又没更新
我通过刷新网页来查询,似乎每次刷新取出来的数据都是随机的,一会正确,一会儿又是脏数据,这到底是怎么回事?另外,
我想知道Eclipse自动生成的Hibernater的DAO类怎么正确地使用事务操作?

解决方案 »

  1.   

    一般都是自己写的DAO很少用Hibernate自动生成的
      

  2.   

    我是在这个自动生成的DAO类中加上事务代码的。
      

  3.   

    请问自动生成的DAO类怎么使用事务代码?
      

  4.   

    DAO里面写事务这么写:       public void InsertUserInfo(Users user)
           {
                Session session=null;
                Transaction tr=null;
        try
          {
           session=super.getSession();
           tr=session.beginTransaction();
           查询数据库....
           tr.commit();
           }catch (RuntimeException e) {
           if(tr!=null)
                 tr.rollback();
           }finally{
                    this.flushSessionAndTransaction(session,tr)
                   }
            } private void flushSessionAndTransaction(Session session, Transaction tr)
    {
    if(null!=session&&session.isOpen())
    {
    session.close();
    session=null;
    tr=null;
    }
    }
    不过话说一般都用spring管理事务的多 DAO里面一个一个写麻烦
      

  5.   

    现在Eclipse这么好用?还能自动生成DAO?我只知道Eclipse可以自动生成SessionFactory,一般Dao都是自己写的,可以处理一些东西,比如异常
      

  6.   

    我试了一下你说的方法,结果还是一样,更新过的数据还是随机出现。
    不过我还是给你加5分,起码回答了我问题:Eclipse自动生成的Hibernater的DAO类怎么正确地使用事务操作?
      

  7.   

    我也遇到过你说的问题,主要是自动生成的DAO它的Session是在Thread范围的。在执行插入和更新时候一旦提交了事务,数据库里的数据是正确更改的,不是事务的操作的问题,但是利用HibernateDAO查询的时候可能会显示原来的数据,很明显是Hibernate缓存的原因,可以提交事务后清空、关闭Session。
      

  8.   

    提交事务后清空关闭SESSION还是一样啊
      

  9.   

    在dao类中一个更新还好点,因为它自带的有事务,但如果是两个更新的话(比如银行转账),就必须先取消它的单个方法里的事物,关于这一点,如果你用了spring,就很好解决了,只需在applicationContext.xml中更改一下配置就行了,具体如下:
    1,将<bean...>替换为<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">2,在根标签<bean></bean>中添加通用事务管理器和指定事务策略,再声明一个config,用以将事务策略和业务类关联起来,具体如下:
    <!--通用事务管理器-->
    <bean id="TransactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <!--指定事务策略,声明一个通知,用以指出要管理哪些事务方法及如何管理-->
    <tx:advice id="txAdvice" transaction-manager="TransactionManager">
    <tx:attributes>
    <!-- 对get/load/search开头的方法要求只读事务 -->
    <tx:method name="find*" propagation="SUPPORTS"
    read-only="true" />
    <!-- 对其它方法要求事务 -->
    <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
    </tx:advice>

    <!--声明一个config,用以将事务策略和业务类关联起来-->
    <aop:config>
    <!-- 添加事务支持,因为前面配置的transactionManager是专对Hibernate的事务管理器-->
    <aop:pointcut id="bizMethods" expression="execution(* bank.biz..*.*(..))" />
    <!-- 织入 -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" />
    </aop:config>
    以上代码,除将事务策略和业务类关联的时候需要更改以外,其它处无需更改,直接复制即可用,更改处说明如下:
     expression="execution(* bank.biz..*.*(..))" 中的bank.biz是包名,后面的..*意思是包含子包,如果不想子包里的方法也要用到事物更改,那么就可改为一个“.”;
    如有不明处,可问我!