2

我收到了问题中的错误。我的道实现类如下:

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. 当SpringFactoryBean<SessionFactory>确实需要 Hibernate 时,您正在注入它SessionFactory
  2. 它实际上并没有使用注入的依赖项。
  3. 您试图在HibernateDaoSupport#getHibernateTemplate()不引用 aSessionFactory或 a 的情况下使用它HibernateTemplate

请注意,只要您给它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;
    }
}

请注意,可以FactoryBeansessionFactory()配置方法返回 ,因为 Spring 将检测并利用其生命周期方法(通过InitializingBean和),但您需要自己调用该方法DisposableBean来适应。FactoryBeangetObject()

于 2013-09-17T14:00:53.493 回答
3

不要使用 HibernateDaoSupport 和/或 HibernateTemplate。随着 Hibernate 3.0.1 的发布,该支持应被视为已弃用。如参考指南中所述,基于普通休眠实现 dao/repository。

你的 dao 看起来像

@Repository
public class UserDaoImpl implements UserDao {

    @Autowired
    private SessionFactory sessionFactory;

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

    @Override
    public List<User> findAllUser() {
        return sessionFactory.getCurrentSession().createQuery("from User").list();
    }

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

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

由于您已经在使用@ComponentScan注释(并且我假设您的 BO 已使用注释@Service并正确注释,@Autowired因此无需在配置中明确配置您的 dao 和服务。

@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() {  
        DriverManagerDataSource dataSource = new DriverManagerDataSource();  
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");  
        dataSource.setUrl("jdbc:mysql://localhost:3306/MyUser");  
        dataSource.setUsername("root");  
        dataSource.setPassword("XXX");  
        return dataSource;  
    }  

    @Bean  
    public AnnotationSessionFactoryBean sessionFactory() { 
        AnnotationSessionFactoryBean sessionFactory = new AnnotationSessionFactoryBean();  
        sessionFactory.setDataSource(dataSource());
        String[] pckage={"com.argus.intenew"};
        sessionFactory.setPackagesToScan(pckage);  
        sessionFactory.setHibernateProperties(hibProperties());
        return sessionFactory; 
    }  

    private Properties hibProperties() { 
        Properties properties = new Properties();  
        properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, "org.hibernate.dialect.MySQLDialect ");  
        properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, "true"); 
        return properties;    
    } 

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

关于DriverManagerDataSource这一点的注释很适合测试,但请不要在生产中使用它(除非你想要一个不执行的应用程序)。请改用适当的 JDBC 连接池。

最后一点,如果你真的想要生产力下降休眠,切换到 JPA 并为你的存储库使用Spring Data JPA。节省您编写大量的实现代码。(并且最好的可维护和可测试的代码是未编写的代码:))。

于 2013-09-17T14:25:54.433 回答