java - hibernate不创建sessionFactory bean

标签 java spring hibernate spring-mvc

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

exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in com.t4b.project.priceBuy.configuration.HibernateConfig: Post-processing of merged bean definition failed; nested exception is 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 + "]";
    }






}

最佳答案

Final edit: Yout need to delete constructor in the Tarif.class

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

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

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

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

并将 hibernate 配置类更改为 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[] {"/"};
        }


    }

Root Config Classes are actually used to Create Beans which are Application Specific and which needs to be available for Filters (As Filters are not part of Servlet). Servlet Config Classes are actually used to Create Beans which are DispatcherServlet specific such as ViewResolvers, ArgumentResolvers, Interceptor, etc.

here is the photo link

关于java - hibernate不创建sessionFactory bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55352322/

相关文章:

Spring Security 和 OpenID Connect (OIDC)

java - Spring缓存抽象——分布式环境

java - 在 hibernate 状态下保存外键

java - 存储 boolean 值

java - 以编程方式查找给定函数的周期性

java - 当鼠标悬停在 jlable 上时将显示图片的面板

java - Hibernate选择子对象进入界面

java - 如何将局部变量的值传递给另一个方法

java - Spring MVC 创建对象请求

java - @JoinFormula 和 @OneToMany 定义 - 糟糕的文档