java - 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 + "]";
}
}
解决方案
最终编辑:您不需要删除 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 等。
推荐阅读
- javascript - Electron.Net:如何以最大化模式启动窗口?
- docker - Docker 构建错误 https://registry-1.docker.io/v2/: x509: 证书有效
- spring-boot - 使用@Value 注解填充变量
- r - Ifelse 条件保留 NA
- java - 使用 POM(pagefactory) 重新更新并行执行
- c# - 如何使用标签助手或 html 助手在选择选项中显示 Font Awesome 图标?
- django - 升级到 oscar 2 的问题
- typescript - 快速服务器中的 CORS 阻止访问
- sql - 有什么更好的方法?SQL select 是一一选择还是一起选择?
- javascript - 使用反应选择多个更新状态的正确方法