81,094
社区成员
发帖
与我相关
我的任务
分享
package com.sxt.dao;
import javax.annotation.Resource;
import org.hibernate.Query;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;
import com.sxt.po.User;
@Component
public class UserDao {
@Resource
private HibernateTemplate hibernateTemplate;
public void add(User u){
System.out.println("UserDao.add()");
hibernateTemplate.save(u);
}
public void delete(User u){
System.out.println("UserDao.delete()");
Query query = hibernateTemplate.getSessionFactory().getCurrentSession().createSQLQuery("delete from user where uname=?");
query.setString(0, u.getUname());
query.executeUpdate();
}
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
}
exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:583)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
<aop:config>
<aop:pointcut expression="execution(public * com.sxt.service.*.*(..))" id="businessService"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="businessService" />
</aop:config>
是做什么用的?
为什么com.sxt.service.*.*
我改成com.sxt.dao.*.*
或改成com.*.*.*.*
程序一样正常?[/quote]
这个很简单,com.sxt.service.*.*可以操作多个表,com.sxt.dao.*.*一般操作一张表,例如汇款,如果配置后面那种,收款方账户不存在,但钱已经扣除了,那钱就回不来了,因为不会回滚操作成功的那张表
<!-- 配置事务管理 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" >
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="txManager" />
<aop:config>
<aop:pointcut expression="execution(public * com.sxt.service.*.*(..))" id="businessService"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="businessService" />
</aop:config>
的<aop:pointcut expression="execution(public * com.sxt.service.*.*(..))" id="businessService"/> 配错了。
package com.sxt.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import com.sxt.dao.UserDao;
import com.sxt.po.User;
@Component
public class UserService {
@Resource
private UserDao userDao;
public void add(String uname){
System.out.println("UserService.add()");
User u = new User();
u.setUname(uname);
userDao.add(u);
}
public void delete(String uname){
System.out.println("UserService.delete()");
User u = new User();
u.setUname(uname);
userDao.delete(u);
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
这里吗?
<aop:config>
<aop:pointcut expression="execution(public * com.sxt.service.*.*(..))" id="businessService"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="businessService" />
</aop:config>
是做什么用的?
答:是spring提供的一套AOP模板,用来注入事务
为什么com.sxt.service.*.*
我改成com.sxt.dao.*.*
或改成com.*.*.*.*
程序一样正常?
答:com.sxt.service.*.*
是将事务注入到Service 的方法里,项目里一般这样配置,因为一个业务逻辑往往需要调用多个dao,为了保证数据的一致性,必须在一个事务里完成
com.sxt.dao.*.**
是将事务注入到dao 的方法里, 如果service调用多个dao,不在同一个事务,是不符合业务逻辑的
com.*.*.*.*
注入到com下
<aop:config>
<aop:pointcut expression="execution(public * com.sxt.service.*.*(..))" id="businessService"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="businessService" />
</aop:config>
是做什么用的?
为什么com.sxt.service.*.*
我改成com.sxt.dao.*.*
或改成com.*.*.*.*
程序一样正常?