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)这个是执行结果!!!!
+---------+---------------------+-------+---------------------+---------+
| 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、程序失败了但是怎么这个事务怎么没有回滚??
2、我怎么样才能让many-to-many里面设置一个序号,具体点就是上面的AUTHRO_SEQ怎么才能自动为 1、2、3之类的??还是要自己怎么设置?
<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&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>
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的啊!!