dao代码
package org.page.dao.impl;import java.util.List;import javax.annotation.Resource;import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.page.dao.IPageDao;
import org.page.entiy.diagram.Diagram;
import org.page.entiy.page.PageBean;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class PageDao extends HibernateDaoSupport implements IPageDao{
    //@Resource private SessionFactory sessionFactory;
    private  Session getLocationSession(){
        return getHibernateTemplate().getSessionFactory().getCurrentSession();
    }
    /**
     * 查询所有记录
     */
    public int getAllRowCount(String hql) {
        this.getLocationSession().getTransaction().begin();
        int allRow=this.getLocationSession().createQuery(hql).list().size();
        this.getLocationSession().getTransaction().commit();
        return allRow;
    }    /**
     * 分页查询
     */
    public List queryForPag(String hql, int start, int size) {
        this.getLocationSession().beginTransaction().begin();
        Query query=this.getLocationSession().createQuery(hql);
        query.setFirstResult(start);
        query.setMaxResults(size);
        List list =query.list();
        this.getLocationSession().beginTransaction().commit();
        return list;
    }    @Override
    public PageBean queryForPage(int pageSize, int page) {
        String hql="from Diagram";
        int allRow = this.getAllRowCount(hql);
        int totalPage = PageBean.countTotalPage(pageSize, allRow);
        int size = pageSize;
        int start = PageBean.countStart(pageSize, page);
        int currentPage = PageBean.countCurrentPage(page);
        List list = this.queryForPag(hql, start, size);
        PageBean pb = new PageBean();
        pb.setAllRow(allRow);
        pb.setTotalPage(totalPage);
        pb.setCurrentPage(currentPage);
        pb.setList(list);
        pb.setPageSize(pageSize);
        pb.init();
        return pb;
    }
    @Override
    public void saveOrUpdate(Diagram diagram) {
        this.getLocationSession().beginTransaction();
        if(diagram.getID()==null){
            this.getLocationSession().save(diagram);
        }else{
            this.getLocationSession().update(diagram);
        }   
        this.getLocationSession().getTransaction().commit();
    }    @Override
    public void delete(Integer id) {
        this.getLocationSession().beginTransaction().begin();
        this.getLocationSession().delete(
                this.getLocationSession().get(Diagram.class, id));
        this.getLocationSession().beginTransaction().commit();
       
    }    @Override
    public Diagram getDiagram(Integer id) {
        this.getLocationSession().beginTransaction().begin();
        Diagram diagram=(Diagram)this.getLocationSession().get(Diagram.class, id);
        this.getLocationSession().beginTransaction().commit();
        return diagram;
    } 
}
用的oracle数据库
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
" http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="org.page.entiy.diagram.Diagram" table="diagram" >
        <id name="ID"  type="java.lang.Integer" column="DIAGRAMID">
            <generator class="native"/>
        </id>
        <property name="DDCC" type="java.lang.String">
            <column name="DDCC" length="10"></column>
        </property>
        <property name="CFCC" type="java.lang.String">
            <column name="CFCC" length="10"></column>
        </property>
        <property name="DDFX" type="java.lang.Integer">
            <column name="DDFX"></column>
        </property>
        <property name="CFFX" type="java.lang.Integer">
            <column name="CFFX"></column>
        </property>
        <property name="TDDDSJ" type="java.lang.String">
            <column name="TDDDSJ" length="4"></column>
        </property>
        <property name="TDCFSJ" type="java.lang.String">
            <column name="TDCFSJ" length="4"></column>
        </property>
        <property name="SX" type="java.lang.String">
            <column name="SX" length="2"></column>
        </property>
        <property name="RK" type="java.lang.Integer">
            <column name="RK"></column>
        </property>
        <property name="HG" type="java.lang.Integer">
            <column name="HG"></column>
        </property>
        <property name="TDZYSJ" type="java.lang.Integer">
            <column name="TDZYSJ"></column>
        </property>
        <property name="TDGD" type="java.lang.String">
            <column name="TDGD" length="4"></column>
        </property>
        <property name="SFZM" type="java.lang.String">
            <column name="SFZM" length="50"></column>
        </property>
        <property name="ZDZM" type="java.lang.String">
            <column name="ZDZM" length="50"></column>
        </property>
        <property name="CDWS" type="java.lang.String">
            <column name="CDWS" length="10"></column>
        </property>
        <property name="SFZGD" type="java.lang.Integer">
            <column name="SFZGD"></column>
        </property>
        <property name="YDYKBZ" type="java.lang.Integer">
            <column name="YDYKBZ"></column>
        </property>
        <property name="BZLS" type="java.lang.Integer">
            <column name="BZLS"></column>
        </property>
        <property name="CCLEVEL" type="java.lang.Integer">
            <column name="CCLEVEL"></column>
        </property>
    </class>
</hibernate-mapping>

解决方案 »

  1.   

    public void saveOrUpdate(Diagram diagram) {
      this.getLocationSession().beginTransaction();
      if(diagram.getID()==null){
      this.getLocationSession().save(diagram);
      }else{
      this.getLocationSession().update(diagram);
      }   
      this.getLocationSession().getTransaction().commit();
      } this.getLocationSession()这么多次 晕
    Session session = this.getLocationSession();
    Transaction tran = session .beginTransaction();
      

  2.   

    diagram.getID()==null都等于null,还能save吗?
    应该与数据库查询出的ID比较
    如果不存在就save
    如果存在先获取数据库对象
    然后用setXXX修改对象属性
    在update
      

  3.   

    “都等于null,还能save吗”
    。。hibernate有逐渐主键生成机制的
    LZ这样写虽然有点怪 但是是没错的
    或者直接saveorupdate()不用判断了
      

  4.   

    哎,我都搞了几天了,SQL语句打印出来了,打断点进去事务也提交了,但是数据库的值就是不变
      

  5.   

    Session session = this.getLocationSession();
    Transaction tran = session .beginTransaction();
    不这样用那怎么用啊
      

  6.   

    session.setFlushMode(FlushMode.AUTO);试一试
      

  7.   

    一样的,还是打印SQL,但是数据库的值不变
      

  8.   

    这些都跟事务有关,个人感觉事务没有提交,
       查找是瞬时状态
     开启 session.beginTransaction();
      提交session.getTransaction().commit();
    若spring 则配置<bean id="autoproxy"
       class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
       <!-- 可以是Service或DAO层(最好是针对业务层*Service) -->
       <property name="beanNames">
        <list>
         <!--表示配置所有以Svr结尾的Bean-->
         <value>*Service</value>
       </list>
       </property>
        <property name="interceptorNames">
             <list>
                 <value>transactionInterceptor</value>
          </list>
        </property>
    </bean>
     试试。<bean id="transactionInterceptor"
       class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name="transactionManager">
             <ref bean="transactionManager" />
         </property>
       <property name="transactionAttributes">
        <props>
         <!-- 指定那些方法参与事务 -->
         <prop key="save*">PROPAGATION_REQUIRED</prop>
         <prop key="update*">PROPAGATION_REQUIRED</prop>
         <prop key="delete*">PROPAGATION_REQUIRED</prop>
         <prop key="find*">PROPAGATION_REQUIRED</prop>
         <prop key="add*">PROPAGATION_REQUIRED</prop>
         <!-- 其它方法为只读事务,避免脏数据检查 -->
         <prop key="*">readOnly</prop>
        </props>
       </property>
    </bean>
      

  9.   

    session取一次就够了 你用一次session取一次 事物能管理好?
    你是2楼那样写的?
      

  10.   

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
    <property name="username" value="ssh"></property>
    <property name="password" value="ssh"></property>
    </bean>
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
    <prop key="hibernate.hbm2ddl.auto">update</prop>
    <prop key="hibernate.current_session_context_class">thread</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.connection.autocommit">true</prop>

    </props>
    </property>
    <property name="mappingResources">
    <list>
    <value>org/page/entiy/diagram/Diagram.hbm.xml</value>
    </list>
    </property>
    </bean>
    <bean id="transactionInterceptor"
      class="org.springframework.transaction.interceptor.TransactionInterceptor">
      <property name="transactionManager">
       <ref bean="transactionManager" />
      </property>
      <property name="transactionAttributes">
      <props>
      <prop key="save*">PROPAGATION_REQUIRED</prop>
      <prop key="update*">PROPAGATION_REQUIRED</prop>
      <prop key="delete*">PROPAGATION_REQUIRED</prop>
      <prop key="find*">PROPAGATION_REQUIRED</prop>
      <prop key="add*">PROPAGATION_REQUIRED</prop>
      <prop key="*">readOnly</prop>
      </props>
      </property>
    </bean>
    <bean id="autoproxy"
      class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
      <property name="beanNames">
        <list>
      <value>*Service</value>
      </list>
      </property>
      <property name="interceptorNames">
      <list>
      <value>transactionInterceptor</value>
      </list>
      </property>
    </bean>
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
       <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    事务配置不成功,启动是不报错,但是事务没有注入进去
      

  11.   

    那session怎么取啊?小弟刚接触这
      

  12.   

    没看出错来 但是你配置的是service
    但是你处理事务的类确实dao
    <property name="beanNames" value="*Service,*Dao" />
      

  13.   

    session取一次,这个怎么取啊?
      

  14.   

    各位大大们,我这样写事务不能开启。报错:org.hibernate.HibernateException: get is not valid without active transaction