Spring Hibernate JPA with Java配置-抽象方法错误
由于Hibernate 5.2贬低了Criteria API,我将所有Criteria API代码更改为JPA,但当我尝试运行该程序时,它会给我以下错误:Spring Hibernate JPA with Java配置-抽象方法错误,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,由于Hibernate 5.2贬低了Criteria API,我将所有Criteria API代码更改为JPA,但当我尝试运行该程序时,它会给我以下错误: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/vincent/SSHAKB/configurati
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/vincent/SSHAKB/configuration/DBConfig.class]: Invocation of init method failed; nested exception is java.lang.AbstractMethodError
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1076)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:851)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4736)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5181)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.AbstractMethodError: null
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:276)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:490)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:878)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:338)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
... 21 common frames omitted
Aug 21, 2016 5:47:59 PM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/vincent/SSHAKB/configuration/DBConfig.class]: Invocation of init method failed; nested exception is java.lang.AbstractMethodError
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1076)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:851)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4736)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5181)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.AbstractMethodError
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:276)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:490)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:878)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:338)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
... 21 more
DBConfig.java
With proper import
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.vincent.SSHAKB")
public class AppConfig extends WebMvcConfigurerAdapter {
/**
* Configure ViewResolvers to deliver preferred views.
*/
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
registry.viewResolver(viewResolver);
}
/**
* Configure ResourceHandlers to serve static resources like CSS/ Javascript etc...
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}
@Override
public void configurePathMatch(PathMatchConfigurer matcher) {
matcher.setUseRegisteredSuffixPatternMatch(true);
}
}
With proper import
@Configuration
@EnableTransactionManagement
@ComponentScan({ "com.vincent.SSHAKB.configuration" })
@PropertySource(value = { "classpath:application.properties" })
public class DBConfig {
static final Logger logger = LoggerFactory.getLogger(DBConfig.class);
@Autowired
private Environment environment;
public DBConfig() {
super();
}
// beans
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] { "com.vincent.SSHAKB.model" });
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(hibernateProperties());
return em;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter()
{
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setShowSql(true);
adapter.setGenerateDdl(false);
adapter.setDatabasePlatform("org.hibernate.dialect.MySQLDialect");
return adapter;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
return dataSource;
}
private Properties hibernateProperties() {
Properties properties = new Properties();
properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
return properties;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
return new PersistenceExceptionTranslationPostProcessor();
}
}
AbstractDao.java
With proper import
public abstract class AbstractDao<T extends Serializable> {
private Class< T > clazz;
@PersistenceContext
EntityManager entityManager;
public final void setClazz( Class< T > clazzToSet ){
this.clazz = clazzToSet;
}
public T findOne( long id ){
return entityManager.find( clazz, id );
}
@SuppressWarnings("unchecked")
public List< T > findAll(){
return entityManager.createQuery( "from " + clazz.getName() )
.getResultList();
}
@SuppressWarnings("unchecked")
public List<T> findAllWithMaxResult(int maxResult){
return entityManager.createQuery("from " + clazz.getName())
.setMaxResults(maxResult).getResultList();
}
public void create( T entity ){
entityManager.persist( entity );
}
public T update( T entity ){
return entityManager.merge( entity );
}
public void delete( T entity ){
entityManager.remove( entity );
}
public void deleteById( long entityId ){
T entity = findOne( entityId );
delete( entity );
}
}
正确导入
公共抽象类AbstractDao{
私人班clazz;
@持久上下文
实体管理器实体管理器;
公共最终无效集合(类别集合集合){
this.clazz=clazzToSet;
}
公共T findOne(长id){
返回entityManager.find(clazz,id);
}
@抑制警告(“未选中”)
公共列表findAll(){
返回entityManager.createQuery(“from”+clazz.getName())
.getResultList();
}
@抑制警告(“未选中”)
公共列表findAllWithMaxResult(int-maxResult){
返回entityManager.createQuery(“from”+clazz.getName())
.setMaxResults(maxResult).getResultList();
}
公共无效创建(T实体){
entityManager.persist(实体);
}
公共T更新(T实体){
返回entityManager.merge(实体);
}
公共作废删除(T实体){
entityManager.remove(实体);
}
公共void deleteById(长entityId){
T entity=findOne(entityId);
删除(实体);
}
}
UserDAOImpl.java
With Proper Import
@Repository("UserDAO")
public class UserDAOImpl extends AbstractDao<User> implements UserDAO {
static final Logger logger = LoggerFactory.getLogger(UserDAOImpl.class);
public UserDAOImpl(){
setClazz(User.class);
}
@Override
public List<User> topTenUsers() {
logger.info("UserDAO topTenUsers");
List<User> users = (List<User>) findAllWithMaxResult(10);
return users;
}
@Override
public List<User> findAll() {
return (List<User>) findAll();
}
}
With Proper Import
@Repository("departmentDAO")
public class DepartmentDAOImpl extends AbstractDao<Department> implements DepartmentDAO{
public DepartmentDAOImpl(){
setClazz(Department.class);
}
@Override
public List<Department> findAll() {
return (List<Department>) findAll();
}
}
正确导入
@存储库(“UserDAO”)
公共类UserDAOImpl扩展了AbstractDao,实现了UserDAO{
静态最终记录器Logger=LoggerFactory.getLogger(UserDAOImpl.class);
公共UserDAOImpl(){
setClazz(User.class);
}
@凌驾
公共列表topTenUsers(){
logger.info(“UserDAO topTenUsers”);
列表用户=(列表)findAllWithMaxResult(10);
返回用户;
}
@凌驾
公共列表findAll(){
返回(列表)findAll();
}
}
DepartmentDAOImpl.java
With Proper Import
@Repository("UserDAO")
public class UserDAOImpl extends AbstractDao<User> implements UserDAO {
static final Logger logger = LoggerFactory.getLogger(UserDAOImpl.class);
public UserDAOImpl(){
setClazz(User.class);
}
@Override
public List<User> topTenUsers() {
logger.info("UserDAO topTenUsers");
List<User> users = (List<User>) findAllWithMaxResult(10);
return users;
}
@Override
public List<User> findAll() {
return (List<User>) findAll();
}
}
With Proper Import
@Repository("departmentDAO")
public class DepartmentDAOImpl extends AbstractDao<Department> implements DepartmentDAO{
public DepartmentDAOImpl(){
setClazz(Department.class);
}
@Override
public List<Department> findAll() {
return (List<Department>) findAll();
}
}
正确导入
@存储库(“部门DAO”)
公共类DepartmentDAOImpl扩展AbstractDao实现DepartmentDAO{
公共部门{
setClazz(系级);
}
@凌驾
公共列表findAll(){
返回(列表)findAll();
}
}
我不明白为什么它说的是抽象错误。。。如果我使用CriteriaAPI的旧方法,代码将正常工作(显然需要更改DBConfig.java的实现)
我已经用一些问题搜索了stackoverflow,但我找不到解决方案
编辑:我用堆栈跟踪更新了错误
解决方法:使用最新的jadira和hibernate验证器,不要混淆hibernate 4和hibernate 5之间的版本您正在为jadira用户类型使用版本3.0.0.CR1。您能试用最新版本的Jadira Usertype Core吗?hibernate 5和jadira用户类型版本存在一些问题。通过使用最新的jadira用户类型和hivernate验证程序进行修复,不要将hibernate 4和hibernate 5之间的版本混合使用。发布嵌套异常。堆栈跟踪末尾的一个。说什么的那个AbstractMethodError@NeilStockton我更新了堆栈跟踪,现在已修复