简体   繁体   English

为什么在第一种情况下会抛出 SessionFactory 异常?

[英]Why is the SessionFactory exception being thrown in first case?

I get this exception with this Configuration class我在这个 Configuration 类中得到这个异常

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableTransactionManagement//enable tx management
@EnableWebMvc//enables webmvc
//load properties into spring container
@PropertySource("classpath:app.properties")
//all layered classes common package name
@ComponentScan("in.nit")
public class AppConfig {

    @Autowired
    private Environment env;

    //1) DataSource
    @Bean
    public DataSource ds() {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName(env.getProperty("db.driver"));
        ds.setUrl(env.getProperty("db.url"));
        ds.setUsername(env.getProperty("db.user"));
        ds.setPassword(env.getProperty("db.pwd"));
        return ds;
    }
    //2)SessionFactory
    @Bean
    public SessionFactory sf() {
        LocalSessionFactoryBean sf = new LocalSessionFactoryBean();
        sf.setDataSource(ds());
        sf.setHibernateProperties(props());
        sf.setPackagesToScan("in.nit.model");
        return  sf.getObject();
    }
    //3)HibernateProperties
    public Properties props() {
        Properties p = new Properties();
        p.put("hibernate.dialect", env.getProperty("orm.dialect"));
        p.put("hibernate.show_sql", env.getProperty("orm.showsql"));
        p.put("hibernate.format_sql",env.getProperty("orm.fmtsql"));
        p.put("hibernate.hbm2ddl.auto", env.getProperty("orm.hbm2ddl.auto"));
        return p;
    }
    //4)HibernateTemplate
    @Bean
    public HibernateTemplate ht() {
        HibernateTemplate  ht = new HibernateTemplate();
        ht.setSessionFactory(sf());
        return ht;
    }
    //5)HibernateTx Manager
    @Bean
    public HibernateTransactionManager htx() {
        HibernateTransactionManager htx = new HibernateTransactionManager();
        htx.setSessionFactory(sf());
        return htx;
    }
    //6)ViewResolver
    @Bean
    public InternalResourceViewResolver ivr() {
        InternalResourceViewResolver ivr = new InternalResourceViewResolver();
        ivr.setPrefix(env.getProperty("mvc.prefix"));
        ivr.setSuffix(env.getProperty("mvc.suffix"));
        return ivr;
    }
}


and I get the exception我得到了例外

Error creating bean with name 'ht' defined in in.nit.config.AppConfig: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sessionFactory' is required

obviously it has something to do with session factory显然它与会话工厂有关

But when i replace the config with the code below it works fine但是当我用下面的代码替换配置时它工作正常


import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableTransactionManagement //enables HtX
@EnableWebMvc // Spring MVC Activated
//load properties into Spring container
@PropertySource("classpath:app.properties")
//all layered classes common package name
@ComponentScan("in.nit")
public class AppConfig2 {

    @Autowired
    private Environment env;

    //1. DataSource
    @Bean
    public DataSource ds() {
        BasicDataSource d=new BasicDataSource();
        d.setDriverClassName(env.getProperty("db.driver"));
        d.setUrl(env.getProperty("db.url"));
        d.setUsername(env.getProperty("db.user"));
        d.setPassword(env.getProperty("db.pwd"));
        return d;
    }
    //2. SessionFactrory
    @Bean
    public LocalSessionFactoryBean sf() {
        LocalSessionFactoryBean s=new LocalSessionFactoryBean();
        s.setDataSource(ds());
        s.setHibernateProperties(props());
        //s.setAnnotatedClasses(ShipmentType.class);
        s.setPackagesToScan("in.nit.model");
        return s;
    }
    @Bean
    public Properties props() {
        Properties p=new Properties();
        p.put("hibernate.dialect", env.getProperty("orm.dialect"));
        p.put("hibernate.show_sql", env.getProperty("orm.showsql"));
        p.put("hibernate.format_sql", env.getProperty("orm.fmtsql"));
        p.put("hibernate.hbm2ddl.auto", env.getProperty("orm.hbm2ddl.auto"));
        return p;
    }

    //3. HT
    @Bean
    public HibernateTemplate ht() {
        HibernateTemplate h=new HibernateTemplate();
        h.setSessionFactory(sf().getObject());
        return h;
    }
    //4. HtxM
    @Bean
    public HibernateTransactionManager htx() {
        HibernateTransactionManager htm=new HibernateTransactionManager();
        htm.setSessionFactory(sf().getObject());
        return htm;
    }
    //5. ViewResovler
    @Bean
    public InternalResourceViewResolver ivr() {
        InternalResourceViewResolver v=new InternalResourceViewResolver();
        v.setPrefix(env.getProperty("mvc.prefix"));
        v.setSuffix(env.getProperty("mvc.suffix"));
        return v;
    }

}

Can anyone explain why is the exception is being thrown in the first case ?谁能解释为什么在第一种情况下抛出异常? And both classes AppConfig and AppCOnfig2 seem to be doing the same thing. AppConfig 和 AppCOnfig2 这两个类似乎都在做同样的事情。 Can anyone point what out specifically where and which lines make a difference?任何人都可以指出具体在哪里以及哪些行有所作为吗?

Definition : LocalSessionFactoryBean is the FactoryBean that creates a Hibernate SessionFactory .定义: LocalSessionFactoryBean 是创建 Hibernate SessionFactory 的 FactoryBean It provides the SessionFactory object and itself is not a SessionFactory.它提供了 SessionFactory 对象,它本身不是一个 SessionFactory。 In case you are getting exception, you are not passing the sessionfactory object and instead passing factoryBean which causes illegalArgumentException.如果您遇到异常,则不会传递 sessionfactory 对象,而是传递导致非法参数异常的 factoryBean。

Original documentation: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/orm/hibernate5/LocalSessionFactoryBean.html原始文档: https : //docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/orm/hibernate5/LocalSessionFactoryBean.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM