先看spring配置文件<!-- 声明事务 -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="pointcut"
expression="execution(* com.service.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" />
</aop:config>再看service方法package com.service.impl;public class UserServiceImpl implements UserService { private UserDao userDao; public UserDao getUserDao() {
return userDao;
} public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void saveUser(USM_USER User) {
this.userDao.saveObject(User);
//做2次插入,按道理第二次会失败,那应该要回滚第一次的插入吧
this.userDao.saveObject(User);
}
}其中userDao继承至BaseDao,底层方法没有把异常抛出,底层自行处理了
详细请看BaseDaoImpl的部分方法public Serializable saveObject(E entity) {
Serializable id = null;
try {
id = getHibernateTemplate().save(entity);
} catch (Exception e) {
logger.error("保存实体对象异常,对象是" + entity, e);
return null;
}
return id;
} public boolean saveOrUpdateObject(E entity) {
try {
getHibernateTemplate().saveOrUpdate(entity);
return true;
} catch (Exception e) {
logger.error("保存或者更新实体对象异常,对象是" + entity, e);
return false;
}
}为什么配置的事物无效呢??
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="pointcut"
expression="execution(* com.service.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" />
</aop:config>再看service方法package com.service.impl;public class UserServiceImpl implements UserService { private UserDao userDao; public UserDao getUserDao() {
return userDao;
} public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void saveUser(USM_USER User) {
this.userDao.saveObject(User);
//做2次插入,按道理第二次会失败,那应该要回滚第一次的插入吧
this.userDao.saveObject(User);
}
}其中userDao继承至BaseDao,底层方法没有把异常抛出,底层自行处理了
详细请看BaseDaoImpl的部分方法public Serializable saveObject(E entity) {
Serializable id = null;
try {
id = getHibernateTemplate().save(entity);
} catch (Exception e) {
logger.error("保存实体对象异常,对象是" + entity, e);
return null;
}
return id;
} public boolean saveOrUpdateObject(E entity) {
try {
getHibernateTemplate().saveOrUpdate(entity);
return true;
} catch (Exception e) {
logger.error("保存或者更新实体对象异常,对象是" + entity, e);
return false;
}
}为什么配置的事物无效呢??
<tx:method name="del*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="update*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="*" propagation="REQUIRED" />这样试试
代码帖出来看看!!!
底层跟service的!
public void saveUser(USM_USER User) {
try {
System.out.println("====");
System.out.println("====");
this.userDao.saveObject(User);
System.out.println("====");
System.out.println("====");
System.out.println("====");
System.out.println("==5==");
USM_USER u = new USM_USER();
this.userDao.saveObject(u);
} catch (Exception e) {
e.printStackTrace();
}
}
DEBUG了一直到System.out.println("==5==");的时候都没有插入数据库,没有发出SQL语句。直到this.userDao.saveObject(u);再次插入的时候然后控制台报异常了,将第一个插入语句发出。
控制台日志如下Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.entity.USM_USER
at org.hibernate.id.Assigned.generate(Assigned.java:33)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:697)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
... 90 more
Hibernate:
insert
into
USM_USER
(orgCode, password, state, userName, loginName)
values
(?, ?, ?, ?, ?)
Hibernate:
在dao层的抛个RuntimeException异常到service层,这样spring应该可以起作用了
或者什么样的异常不回滚、