spring.xml
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource">
     <ref bean="dataSource"/>
    </property>
    <property name="hibernateProperties">
       <props>
         <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
         <prop key="hibernate.show_sql">true</prop>
         <prop key="hibernate.connection.autocommit">true</prop>
         <prop key="hibernate.hbm2ddl.auto">update</prop>
       </props>
    </property>
  
    <property name="packagesToScan">
<list>
<value>com.aq.osgi.mdm.beans</value>
</list>
    </property>
 </bean>
    <bean id="transactionManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
        <property name="sessionFactory" ref="sessionFactory" />  
   </bean> 
   
   <aop:aspectj-autoproxy />
   
   <tx:annotation-driven transaction-manager="transactionManager"/> 

<context:component-scan base-package="com.aq.osgi.mdm">
<context:exclude-filter type="regex" expression=".*Controller$" />
</context:component-scan>BaseDAO.java
public abstract class BaseDAO extends HibernateDaoSupport{
@Resource(name = "sessionFactory")
    public void getHibernateSession(SessionFactory sessionFactory)
    {
        setSessionFactory(sessionFactory);
    }
 protected void delete(Object object)
        throws CurrentlyException
    {
        try
        {
            this.getHibernateTemplate().delete(object);
        }
        catch (HibernateException he)
        {
           ....
        }
    }
protected Object load(Class<?> clazz, Serializable id)
        throws CurrentlyException
    {
        Object returnObject = null;
        
        try
        {
            // 操作数据库返回操作结果
            returnObject = this.getHibernateTemplate().load(clazz, id);
        }
        catch (Exception ex)
        {
            .....
        }       
        return returnObject;
    }
}还有个dao调用(dao我是用@Repository注入的)
public class MyDAO extends BaseDAO{
   public void delete(MyObject obj){
   delete(obj)
}
  public MyObject loadObj(Class clz,Long id){
    return (MyObject)load(clz,id)
}
}service注入dao
public class MyServiceImpl implements IMyService{
    @Resource
    private MyDAO myDAO;此处注解似乎无效,仍然抛出异常,说有2个session ------ >@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void test(MyObject obj){
  obj = myDAO.loadObj(obj.class,obj.getId());
  myDAO.delete(obj)
}
}
望高手赐教!!!!!!!!!!!

解决方案 »

  1.   

    Do not use MyDAO to extend BaseDAO
    You can use MyDAO only (extends HibernateDaoSupport), your problem will be solved. Like followings:public   class   MyDAO   extends   HibernateDaoSupport{
         -----------
      

  2.   

    @Transactional注解放在service借口上即可!@Transactional
    public interface SomeService {
        public void doSomeThing();
    }这样,在服务层事务就会以默认方式开启。 
    所谓默认方式。设计到
    事务隔离级别
    事务的传播性质
    事务是否为只读具体每项到底什么含义,你可以参考spring或者JTA的文档。
      

  3.   

     private   MyDAO   myDAO; 此处要封装啊  你不封装怎么注入 找不到set @Component("MyDAO")  //声明
    public   class   MyDAO   extends   BaseDAO{ 
    ^^^^^^
    }在MyDAO的set方法上注入 
    @Resource(name = "MyDAO")
      

  4.   

    你的代码不全,最好将error log 全部贴出来 。根据错误log提示,注解无效,就是注错了地方,两个session主要是你test类写的有问题。解决你注解无效的问题:
       public class MyServiceImpl implements IMyService{  private   MyDAO   myDAO;  @Resource
    public void setMyDAO(MyDAO myDAO) {
        this.myDAO = myDAO;
    }
       }
      
       此处的dao注入sevice如上楼所言,注入的概念就是dao的实例化工作交给spring容器来实现,然后需要把实例化的dao对象交给service,但是你之前的代码只是声明了dao属性,service其他方法调用这个属性时会发现找不到它的实例化对象,所以需要set方法来封装它。注解是注在set方法上,相关其他详细解释可查询spring源码或者文档。test 中两个session需要你重新改写test代码。因为看不到你全部代码。
      

  5.   

    为dao、service中的对象提供get and set方法~~并注入~~