2

質問のようにエラーが発生しています。私の Dao 実装クラスは次のとおりです。

package com.argus.intenew;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

@Autowired
AnnotationSessionFactoryBean sessionFactory;
    public UserDaoImpl() {
    }

    public AnnotationSessionFactoryBean getCurrentSessionFactory() {
        return sessionFactory;
    }

    public void  setCurrentSessionFactory(AnnotationSessionFactoryBean sessionfactory) {
        this.sessionFactory = sessionfactory;
    }

    @Override
    public void addUser(UserMap userMap) {
        System.out.println("33333333333333333333");
        getHibernateTemplate().save(userMap);
    }

    @Override
    public List<User> findAllUser() {
        return getHibernateTemplate().find("from User");
    }

    @Override
    public void deleteUser(UserMap user) {
        getHibernateTemplate().delete(user);
    }

    @Override
    public void updateUser(UserMap user) {
        getHibernateTemplate().update(user);
    }
}

そして、私の構成クラスは次のとおりです。

package com.argus.intenew;

import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean;

@Configuration
@ComponentScan(basePackages = {"com.argus.intenew"})
public class Webconfig  {
    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "org.hibernate.dialect.MySQLDialect ";
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "true";

    @Bean
    public DataSource dataSource() {
        System.out.println("----------InDATAsource------------");
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/MyUser");
        dataSource.setUsername("root");
        dataSource.setPassword("XXX");
        System.out.println("----------OutofDATAsource------------");
        return dataSource;
    }

    @Bean
    public AnnotationSessionFactoryBean sessionFactory() {
        System.out.println("----------InsessionFactory------------");
        AnnotationSessionFactoryBean sessionFactory = new AnnotationSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        String[] pckage={"com.argus.intenew"};
        sessionFactory.setPackagesToScan(pckage);
        sessionFactory.setHibernateProperties(hibProperties());
        System.out.println("----------Outof session------------");
        return sessionFactory;
    }

    private Properties hibProperties() {
        System.out.println("----------InhipProp------------");
        Properties properties = new Properties();
        properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, "org.hibernate.dialect.MySQLDialect ");
        properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, "true");
        System.out.println("----------outofhip------------");
        return properties;
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory().getObject());

        return transactionManager;
   }

   @Bean
   public UserBoImpl userBo() {
       System.out.println("----------InUserBo------------");
       UserBoImpl userBo= new UserBoImpl();
       userBo.setUserDao(userDao());
       System.out.println("----------OutofUserbo------------");
       return userBo;
   }

   @Bean
   public UserDaoImpl userDao() {
       System.out.println("----------InUserDao------------");
       UserDaoImpl userDao=new UserDaoImpl();
       userDao.setCurrentSessionFactory(sessionFactory());
       System.out.println("----------OutofUserDao------------");
       return userDao;
   }
}

誰でも助けて、注釈を使ってこれを行う正しい方法を教えてください。ここでは、xml ファイルを使用していません。

4

2 に答える 2

4

あなたの DAO 実装は、そのスーパークラスを正しく活用していません。

  1. FactoryBean<SessionFactory>本当に Hibernate が必要なときにSpring を注入していますSessionFactory
  2. 注入された依存関係を実際に使用しているわけではありません。
  3. またはHibernateDaoSupport#getHibernateTemplate()への参照を指定せずに使用しようとしています。SessionFactoryHibernateTemplate

を指定する限り、HibernateDaoSupportそれ自体が作成されることに注意してください。HibernateTemplateSessionFactory

次の変更を行うことをお勧めします。

  1. AnnotationSessionFactoryBean sessionFactoryから削除UserDaoImpl
  2. UserDaoImpl継承されたsetSessionFactory(SessionFactory)メソッドを利用しての構成を修正する

したがって、実際には次の DAO コードになります。

public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
    @Override
    public void addUser(UserMap userMap) {
        getHibernateTemplate().save(userMap);
    }
    @Override
    public List<User> findAllUser() {
        return getHibernateTemplate().find("from User");
    }
    @Override
    public void deleteUser(UserMap user) {
        getHibernateTemplate().delete(user);
    }
    @Override
    public void updateUser(UserMap user) {
        getHibernateTemplate().update(user);
    }
}

そして、この構成コード:

@Configuration
@ComponentScan(basePackages = {"com.argus.intenew"})  
public class Webconfig  {
    //snip...
    @Bean
    public UserDaoImpl userDao() {
        UserDaoImpl userDao=new UserDaoImpl();
        userDao.setSessionFactory(sessionFactory().getObject());
        return userDao;
    }
}

Spring は ( および を介して) そのライフサイクル メソッドを検出して利用するためFactoryBean、構成メソッドからを返すことは問題ありませんが、メソッドを自分で呼び出して対応する必要があることに注意してください。sessionFactory()InitializingBeanDisposableBeanFactoryBeangetObject()

于 2013-09-17T14:00:53.493 に答える