mysql> select * from book;
+---------+---------------------+-------+---------------------+---------+
| BOOK_ID | NAME                | PRICE | PRESS_TIME          | VERSION |
+---------+---------------------+-------+---------------------+---------+
|       1 | Hibernate In Action |    50 | 2005-07-26 16:29:32 |       1 |
+---------+---------------------+-------+---------------------+---------+
1 row in set (0.00 sec)mysql> select * from author;
+-----------+-----------+----------+----------+
| AUTHOR_ID | USER_NAME | REALNAME | BIRTHDAY |
+-----------+-----------+----------+----------+
|         1 | feng      | feng     | NULL     |
|         2 | liu       | liu      | NULL     |
+-----------+-----------+----------+----------+
2 rows in set (0.00 sec)mysql> select * from book_author;
+-----------+---------+------------+
| AUTHOR_ID | BOOK_ID | AUTHRO_SEQ |
+-----------+---------+------------+
|         1 |       1 |          0 |
+-----------+---------+------------+
1 row in set (0.00 sec)这个是执行结果!!!!

解决方案 »

  1.   

    因此,我的两个问题就是:
    1、程序失败了但是怎么这个事务怎么没有回滚??
    2、我怎么样才能让many-to-many里面设置一个序号,具体点就是上面的AUTHRO_SEQ怎么才能自动为 1、2、3之类的??还是要自己怎么设置?
      

  2.   

    测试了一下,事务完全没有起作用,请大家帮我看看是哪儿配置出的问题,我都认真检查了没有看出哪儿有问题!谢谢了:)下面是applicationContext.xml的所有数据信息:<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans>        <!-- begin define the data source-->
            <bean id="dataSource"
                    class="org.apache.commons.dbcp.BasicDataSource">
                    <property name="driverClassName">
                            <value>com.mysql.jdbc.Driver</value>
                    </property>
                    <property name="url">
                            <value>jdbc:mysql://localhost:3306/study?useUnicode=true&amp;characterEncoding=UTF-8</value>
                    </property>
                    <property name="username">
                            <value>boco</value>
                    </property>
                    <property name="password">
                            <value>boco</value>
                    </property>
                    <property name="maxActive">
                            <value>20</value>
                    </property>
                    <property name="maxIdle">
                            <value>8</value>
                    </property>
                    <property name="maxWait">
                            <value>120000</value>
                    </property>
                    <property name="defaultAutoCommit">
                            <value>false</value>
                    </property>
            </bean>
            <!-- end define the data source-->        <!-- BEGIN define the session factory of the hibernate. -->
            <bean id="sessionFactory"
                    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
                    <property name="dataSource">
                            <ref local="dataSource" />
                    </property>
                    <property name="mappingDirectoryLocations">
                            <list>
                                    <value>classpath:/org/study/model</value>
                            </list>
                    </property>
                    <property name="hibernateProperties">
                            <props>
                                    <prop key="hibernate.dialect">
                                            org.hibernate.dialect.MySQLDialect
                                    </prop>
                                    <prop key="bibernate.show_sql">true</prop>
                            </props>
                    </property>
            </bean>
            <!-- END define the session factory of the hibernate. -->        <!-- BEGIN define a transaction manager-->
            <bean id="transactionAttributeSource"
                    class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
                    <property name="properties">
                            <props>
                                    <prop key="add*">PROPAGATION_REQUIRED</prop>
                                    <prop key="new*">PROPAGATION_REQUIRED</prop>
                                    <prop key="save*">PROPAGATION_REQUIRED</prop>
                                    <prop key="del*">PROPAGATION_REQUIRED</prop>
                                    <prop key="get*">PROPAGATION_SUPPORTS, readOnly</prop>
                            </props>
                    </property>
            </bean>        <bean id="transactionManager"
                    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                    <property name="sessionFactory">
                            <ref local="sessionFactory" />
                    </property>
            </bean>        <bean id="baseTxProxy" abstract="true" lazy-init="true"
                    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
                    <property name="transactionManager">
                            <ref bean="transactionManager" />
                    </property>
                    <property name="transactionAttributeSource">
                            <ref local="transactionAttributeSource" />
                    </property>
            </bean>
            <!-- END define a transaction manager-->        <!-- BEGIN define the DAO Bean-->
            <bean id="authorDao"
                    class="org.study.hibernate.dao.hibernate.AuthorDAOImpl">
                    <property name="sessionFactory">
                            <ref local="sessionFactory" />
                    </property>
            </bean>        <bean id="bookDao"
                    class="org.study.hibernate.dao.hibernate.BookDAOImpl">
                    <property name="sessionFactory">
                            <ref local="sessionFactory" />
                    </property>
            </bean>        <bean id="userDao"
                    class="org.study.hibernate.dao.hibernate.UserDAOImpl">
                    <property name="sessionFactory">
                            <ref local="sessionFactory" />
                    </property>
            </bean>
            <!-- END define the DAO Bean-->        <!-- BEGIN define the the service -->
            <bean id="bookService" parent="baseTxProxy">
                    <property name="target">
                            <bean class="org.study.service.BookService">
                                    <property name="bookDao">
                                            <ref local="bookDao" />
                                    </property>
                            </bean>
                    </property>
            </bean>        <bean id="userService" parent="baseTxProxy">
                    <property name="target">
                            <bean class="org.study.service.UserService">
                                    <property name="userDao">
                                            <ref local="userDao" />
                                    </property>
                            </bean>
                    </property>
            </bean>
            <!-- END define the service --></beans>
      

  3.   

    检查失败后抛出的异常是否是RunException,spring只对RunException回滚。
      

  4.   

    对,就是RuntimeExceptioni,我后来测试的时候没用many-to-many了,就测试一般的数据保存,我在BookDAOImp和BookDAO中增加了一个方法:saveBook2(Book book),实现为:public void saveBook2(Book book) {
        getHibernateTemplate().saveOrUpdate(book);
        throw new ApplicationException("故意错误...");
    }而saveBook方法没有变,仍然是:
    public void saveBook(Book book) {
        getHibernateTemplate().saveOrUpdate(book);
    }然后在BookServiceImpl的saveBook(Book book)方法改为
    public void saveBook(Book book) {
        bookDao.saveBook(book);
        bookDao.saveBook2(book);
    }JUnit的测试代码为:
    public void testNewBook2() {
        Book book = new Book();
        book.setName("Hibernate In Action");
        book.setPressTime(Calendar.getInstance().getTime());
        book.setPrice(50);
        book.setVersion((float) 1.0);
        bookService.saveBook(book);             
    }测试完毕,数据结果为:
    +---------+---------------------+-------+---------------------+---------+
    | BOOK_ID | NAME                | PRICE | PRESS_TIME          | VERSION |
    +---------+---------------------+-------+---------------------+---------+
    |      16 | Hibernate In Action |    50 | 2005-07-27 13:44:27 |       1 |
    +---------+---------------------+-------+---------------------+---------+可见数据并没有回滚,而且异常也属于RuntimeException的啊!!
      

  5.   

    不能回滚的问题解决了!!我以前用informix和sqlserver习惯了,所以把数据库的事务功能当成理所当然的了,没有想到mysql对事务的支持还要做特定的处理,设置表的类型为innodb才支持事务,郁闷了两天!!现在我想问兄弟们最后一个没有解决的问题,那就是:怎么将List的序号保存到数据库中去,具体来说就是假设一本书有多个作者,作者在Book中用类型为List的authors来表示,怎么将这个序号信息保存到Book和Author的关联表Book_Author中去。Book_Author包含 Book_id, Author_id, Author_seq 三个字段,我希望这个序号能在Author_seq中自动表示出来。谢谢了:)