Hibernate 5.0.11-AttributeConverter类多次注册 [英] Hibernate 5.0.11 - AttributeConverter class registered multiple times
问题描述
我将Spring Boot升级到1.4.2,将Hibernate升级到5.0.11.Final,并开始看到此错误.即使HibernateJpaAutoConfiguration
仅声明一次,也不确定为什么HibernateJpaAutoConfiguration
要多次注册客户转换器.
I upgraded Spring Boot to 1.4.2 and Hibernate to 5.0.11.Final and started seeing this error. Not sure why HibernateJpaAutoConfiguration
is registering the customer converter multiple times even though it is declared only once.
当我尝试运行到bootRun
时,将引发以下异常.
Following exception is being thrown when I try to run to bootRun
.
任何帮助都是真的.
[32m2016-11-22 12:25:26.469 -- INFO -- o.a.c.c.StandardService [main] -- Stopping service Tomcat
[[32m2016-11-22 12:25:26.485 -- INFO -- utoConfigurationReportLoggingInitializer [main] --
Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
[[1;31m2016-11-22 12:25:26.489 -- ERROR -- o.s.b.SpringApplication [main] -- Application startup failed
[org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AssertionFailure: AttributeConverter class [class com.testOrg.converter.InvertedBooleanTFConverter] registered multiple times
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) ~[spring-context-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856) ~[spring-context-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.4.2.RELEASE.jar:1.4.2.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761) [spring-boot-1.4.2.RELEASE.jar:1.4.2.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371) [spring-boot-1.4.2.RELEASE.jar:1.4.2.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-1.4.2.RELEASE.jar:1.4.2.RELEASE]
at com.testOrg.Application.main(Application.java:17) [main/:?]
Caused by: org.hibernate.AssertionFailure: AttributeConverter class [class com.testOrg.location.uk.service.converter.InvertedBooleanTFConverter] registered multiple times
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addAttributeConverter(InFlightMetadataCollectorImpl.java:353) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addAttributeConverter(InFlightMetadataCollectorImpl.java:386) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl$AttributeConverterManager.addAttributeConverter(AnnotationMetadataSourceProcessorImpl.java:321) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.categorizeAnnotatedClass(AnnotationMetadataSourceProcessorImpl.java:117) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.<init>(AnnotationMetadataSourceProcessorImpl.java:104) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.<init>(MetadataBuildingProcess.java:147) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:141) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) ~[spring-orm-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373) ~[spring-orm-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362) ~[spring-orm-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
... 14 more
Disconnected from the target VM, address: '127.0.0.1:54978', transport: 'socket'
:web:bootRun FAILED
推荐答案
由于数据库配置位于有意义的子文件夹中,因此JPA的@EnableAutoconfiguration
会通过两个路径进行扫描.
Somehow the @EnableAutoconfiguration
of JPA were passing two paths to get scanned, because the database configuration was in sub folder which makes sense.
com.testOrg
com.testOrg.configuration
第520行的
org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager
根据找到的扫描配置路径的数量多次添加转换器,
我认为对于其他类,我们没有检查重复性,但对于Converters,我们确实检查了它是否被注册了多次,而不是抛出Exception异常. com.testOrg.configuration.MetadataBuilderImpl.java
907行
org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager
on line 520 is adding converters multiple times based on the number of scanned configuration paths found,
I think for other classes we do not have check for duplicacy but for Converters we do have check if it gets registered multiple times than throw Exception see. com.testOrg.configuration.MetadataBuilderImpl.java
line 907
为解决此问题,我将DatabaseConfiguration类从"com.testOrg.configuration"
文件夹移至main,因此仅需注册一个类.
To solve this, I moved my DatabaseConfiguration class out of "com.testOrg.configuration"
folder to main and hence only one class to register.
我希望这可能对某人有所帮助.
I hope this might be helpful for someone.
这篇关于Hibernate 5.0.11-AttributeConverter类多次注册的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!