hibernate - Hibernate 5 和 Spring Boot 2 - 多次注册的 AttributeConverter 类
问题描述
在我的 Spring Boot 应用程序中,我有一个简单的 JPAAttributeConverter
声明如下:
@Converter(autoApply = true)
public class GenderConverter implements AttributeConverter<Gender, String> {...}
并应用如下:
@Entity
public class User {
@Column(length = 1, nullable = false)
private Gender gender;
// ...
}
如果我使用 IntelliJ IDEA 运行/调试配置来启动 Spring Boot 应用程序,上下文初始化会因为AssertionFailure
异常而失败。如果我使用gradle clean bootRun
该应用程序成功启动。因此,这似乎是 IDE 中的错误或项目设置中的错误。
我调试并转储了转换器的两个后续注册的堆栈跟踪,但我仍然不明白为什么它会发生两次。请分析堆栈跟踪。
首次注册(无错误):
at org.hibernate.boot.internal.AttributeConverterManager.addConverter(AttributeConverterManager.java:44)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addAttributeConverter(InFlightMetadataCollectorImpl.java:353)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:118)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:861)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:888)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1758)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1695)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:573)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$122.379121284.getObject(Unknown Source:-1)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
....
第二次注册(错误!):
Caused by: org.hibernate.AssertionFailure: AttributeConverter class [class by.naxa.example.conversion.GenderConverter] registered multiple times
at org.hibernate.boot.internal.AttributeConverterManager.addConverter(AttributeConverterManager.java:46) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addAttributeConverter(InFlightMetadataCollectorImpl.java:353) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addAttributeConverter(InFlightMetadataCollectorImpl.java:363) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl$AttributeConverterManager.addAttributeConverter(AnnotationMetadataSourceProcessorImpl.java:325) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.categorizeAnnotatedClass(AnnotationMetadataSourceProcessorImpl.java:118) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.<init>(AnnotationMetadataSourceProcessorImpl.java:105) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.<init>(MetadataBuildingProcess.java:147) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:141) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:861) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:888) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) ~[spring-orm-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390) ~[spring-orm-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377) ~[spring-orm-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1758) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1695) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]
....
gradle :dependencyInsight --dependency jpa
如果您认为可能有帮助,我可以包含我的项目结构 > 模块的输出或屏幕截图。
我知道有一个类似的问题,但接受的解决方案对我没有帮助。我不使用@EnableAutoconfiguration
注释。我的主要课程很简单:
@SpringBootApplication
public class MysqlApplication {
public static void main(String[] args) {
SpringApplication.run(MysqlApplication.class, args);
}
}
解决方案
这似乎是 IntelliJ IDEA 和 Spring Boot Dev Tools的问题。以下步骤帮助我在 Ubuntu 中解决了这个问题,但在 Windows 10 中没有。
devtools
从 build.gradle 中删除依赖项:
// runtimeClasspath group: 'org.springframework.boot', name: 'spring-boot-devtools'
构建 > 清理项目
关闭 IntelliJ IDEA:
文件 > 退出
执行
gradle clean
从项目根文件夹中删除文件夹:build、out、.gradle:
rm -rf build out .gradle
清理系统缓存:
启动 IntelliJ IDEA 并转到菜单 File > Invalidate Caches / Restart
等待 IntelliJ 更新索引
现在尝试再次运行调试配置。重建项目需要一段时间,但它应该会成功启动。
推荐阅读
- java - 如何将OX12转换为十进制
- python - 根据不同的行值创建新列并计算每个值的频率
- php - 使用 Jquery Ajax 将数据发送到另一个页面不起作用
- python - 在 Python 中运行树结构
- c++ - C++类指针动态数组释放问题
- python - 修复此检查器中的线程错误并使其接受更多线程
- html - 如何从 CSS 中的图像复制此文本?
- google-chrome - 如何从 gdrive 中删除此文件夹 - 它仍然显示
- apache-spark - Spark 3.0 JdbcRDD Java - 为没有 ID 列的视图指定 lowerBound 和 upperBound 的问题
- java - 了解 OpenJDK 与 Oracle JDK 的使用