前几天写一个后台项目,使用已经建好的数据库生成实体类,然后再用Spring Boot构建Controller等等。
本来项目跑得好好的,在用到了一个实体类之后突然不能正常启动,报的错是
java.lang.IllegalArgumentException: Not a managed type: class com.varkarix.xxx.entity.XxxEntity
。
StackOverflow上搜了一下,大致意思是说,Spring没有扫描到这个实体类的Bean,所以要在启动的时候添加@EntityScan、@ComponentScan一类的注解,让其扫描到这个实体类。
这令我十分不解。跟这个实体类在同一个包下的其他实体类都能正常使用,而它却不行,感觉就不是扫描的问题。照葫芦画瓢用这个Scan相关的方式改了一下,发现问题还是一模一样的,没有任何变化。
这时候又看了一眼搜到的几个问题。大家都是在Spring绑定Bean的时候报的错,而我这个不是。我这个是绑定完了之后,Hikari连接池建立的过程中报的错。转念一想突然发现,这个实体类是一个视图生成的,而这个视图用到了另一个数据库的字段。也就是说,当时建表的时候欠考虑,添加了一个跨数据库的外键,而Spring Data JPA并不支持这种跨数据库的读取,可能是因为jdbc的URL里规定了数据库的名称吧。
最后还是把这个实体类删掉了,因为数据量不大,通过两个数据库分别查询,再用一个Dict把字段关联起来就解决了这个问题。不过我觉得这个报错信息还是有一定的问题,连接池发现这个实体类不能使用的时候,直接使这个Bean失效了,导致了这个不该发生的错误,我觉得或许可以有更好的解决办法。
总结:建数据库的时候要想清楚,当时的我就是不是很懂数据库相关结构,给同一个项目建了几个数据库,分别存不同分类的数据,现在看来应该建不同的表来解决这个问题,而不是建不同的数据库。