首页 > 解决方案 > hibernate 不创建 sessionFactory bean

问题描述

我是 hibernate 新手并在 spring 5 中使用它,我有一个配置类,它创建 sessionFactory bean 但它不起作用(创建),运行我的项目时出现此错误:

异常是 org.springframework.beans.factory.BeanCreationException:创建 com.t4b.project.priceBuy.configuration.HibernateConfig 中定义的名称为“sessionFactory”的 bean 时出错:合并 bean 定义的后处理失败;嵌套异常是 java.lang.IllegalStateException: Failed to introspect Class [org.springframework.orm.hibernate5.LocalSessionFactoryBean] from ClassLoader [ParallelWebappClassLoader: priceBuy

// configuration class

    @Configuration
    public class HibernateConfig {


        @Bean
        public LocalSessionFactoryBean sessionFactory() {

        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();

        sessionFactoryBean.setHibernateProperties(properties());
        sessionFactoryBean.setAnnotatedClasses(Tarif.class);

        return sessionFactoryBean;

        }

        @Bean
        public Properties properties() {

            Properties properties = new Properties();

            properties.setProperty(AvailableSettings.URL, "jdbc:mysql://localhost:3306/SPRING-LEARN");
            properties.setProperty(AvailableSettings.USER, "root");
            properties.setProperty(AvailableSettings.PASS, "carrow");
            properties.setProperty(AvailableSettings.DIALECT, MySQL5Dialect.class.getName());
            properties.setProperty(AvailableSettings.SHOW_SQL, String.valueOf(true));
            properties.setProperty(AvailableSettings.HBM2DDL_AUTO, "update");


            return properties;
        }

    }


    public class PriceBuyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

        @Override
        protected Class<?>[] getRootConfigClasses() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        protected Class<?>[] getServletConfigClasses() {
            // TODO Auto-generated method stub
            return new Class[] {PriceBuyWebApplicationConfiguration.class, ConverterConfig.class, HibernateConfig.class};
        }

        @Override
        protected String[] getServletMappings() {
            // TODO Auto-generated method stub
            return new String[] {"/"};
        }


    }


    // controller


    @RestController
    @RequestMapping("/tarif")
    public class TarifController {

        @Autowired
        TarifDao TarifDao;

        @RequestMapping(method =  RequestMethod.GET)
        public String saveTarif(Model model) {
            Tarif tarif = new Tarif("CK09", 1234);

            TarifDao.insertTarif(tarif);

            return "tarif";
        }
    }

    // tarif class
package com.t4b.project.priceBuy.entities;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "tarif")
public class Tarif {

    @Id
    @Column(name ="code")
    private String code;

    @Column(name ="tax")
    private double tax;

    public Tarif(String code, double tax) {
        this.code = code;
        this.tax  = tax; 
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public double getTax() {
        return tax;
    }

    public void setTax(double tax) {
        this.tax = tax;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((code == null) ? 0 : code.hashCode());
        long temp;
        temp = Double.doubleToLongBits(tax);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Tarif other = (Tarif) obj;
        if (code == null) {
            if (other.code != null)
                return false;
        } else if (!code.equals(other.code))
            return false;
        if (Double.doubleToLongBits(tax) != Double.doubleToLongBits(other.tax))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Tarif [code=" + code + ", tax=" + tax + "]";
    }






}

标签: javaspringhibernatespring-mvc

解决方案


最终编辑:您不需要删除 Tarif.class 中的构造函数

  public Tarif(String code, double tax) {
        this.code = code;
        this.tax  = tax; 
    }

删除这个。因为休眠与 POJO 一起工作。和 POJO 没有构造函数。它现在应该可以工作了

您需要为模型(实体类)提供休眠路径,就像那样(使用 setPackagesToScan

  @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan("models");
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }

并将休眠配置类更改为 gerRootConfigClasses() 方法。因为我也遇到过这种问题,放入rootConfig后就解决了。

public class PriceBuyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

        @Override
        protected Class<?>[] getRootConfigClasses() {
             return new Class[]{HibernateConfig.class};
        }

        @Override
        protected Class<?>[] getServletConfigClasses() {
            // TODO Auto-generated method stub
            return new Class[] {PriceBuyWebApplicationConfiguration.class, ConverterConfig.class};
        }

        @Override
        protected String[] getServletMappings() {
            // TODO Auto-generated method stub
            return new String[] {"/"};
        }


    }

根配置类实际上用于创建特定于应用程序且需要可用于过滤器的 Bean(因为过滤器不是 Servlet 的一部分)。Servlet 配置类实际上用于创建特定于 DispatcherServlet 的 Bean,例如 ViewResolvers、ArgumentResolvers、Interceptor 等。

这是照片链接


推荐阅读