Spring Boot下 org.hibernate.AnnotationException异常的一种解决方法

异常如下

核心异常:Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.xiaomo.xxxx.model.yyy.Clock.user references an unknown entity: com.xiaomo.zzzz.model.user.User

Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.xiaomo.xxxx.model.yyy.Clock.user references an unknown entity: com.xiaomo.zzzz.model.user.User
	at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:97) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1827) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1771) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1658) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:287) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:904) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:935) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) ~[spring-orm-5.1.2.RELEASE.jar:5.1.2.RELEASE]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.1.2.RELEASE.jar:5.1.2.RELEASE]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390) ~[spring-orm-5.1.2.RELEASE.jar:5.1.2.RELEASE]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377) ~[spring-orm-5.1.2.RELEASE.jar:5.1.2.RELEASE]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.1.2.RELEASE.jar:5.1.2.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1741) ~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
	... 16 common frames omitted

环境记录

  1. Spring Boot + JPA + Maven;项目使用Maven管理依赖,通过多模块来组织。
  2. com.xiaomo.zzzz.model.user.User 是公共模块中的用户类,com.xiaomo.zzzz为基础模块,被其他模块共用;该模块记为A
  3. com.xiaomo.xxxx.model.yyy.Clock 是一个模块中的实体类,它有一个User引用,该模块记为B。该User来自公共模块。
  4. 启动B,之后就出现了这个错误。

问题分析

第一反应,当然是百度了。找到两个比较好的答案,一个是CSDN上的,另一个是StackOverflow上,但是两者都使用xml配置Hibernate,不能“拿来就用”。
链接传送:
CSDN上的解决方法
StackOverflow上的解决方法
具体来说就是:
(1) 被引用的类的class上没添@Entity注解
(2)没有添加到sessionFactory的annotatedClasses属性列表中去或者是配置文件中没有添加
可是,对于(1),肯定是有注解的;对于(2),压根没有xml。还是不能拿来就用。但是,(2)其实是说Hibernate框架没有找到这个实体类。而xml配置其实作用就是告诉框架从哪里去找。所以,应该是Spring boot 的配置的问题。

解决方案

  1. Spring Boot 项目中,默认的扫描包为main方法所在的包,也就说,只有和main方法在同一个包中的实体类才会被发现。这样就可以理解为什么找不到User了:因为User是另一个模块里的实体类啊。Spring Boot根本就没有扫描其他包;
  2. 配置启动应用程序的main方法上的@SpringBootApplication注解,告诉Spring Boot,那些包需要被扫描:@SpringBootApplication(scanBasePackages = {“com.xiaomo.*”})
  3. 然后,User就可以被找到了。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值