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