在实际的项目中我们经常会遇到两个实体关系是多对多的,这个时候同长会有一张用来维护实体关系的中间表。这次我就遇到了一个多对多的问题,而且其中还掺杂了抽象类干扰。
问题描述
两个实体:角色和菜单,多对多关联,由一张中间表来维护。现在要修改其中其中菜单的关联,将菜单换成他的基类菜单。出现问题的位置:通过角色获取所有的菜单。
解决过程
修改实体对应的关系这个比较简单,但在进行查询操作的时候就出现了问题。我们都知道,在通过角色获取所有菜单的时候,必然要通过中间表来找到对应的菜单。这时候报错出现了:

可以看到,报错中说不能从元组中实例化BaseWebAppMenu这个类从。原因是什么呢?
中间Google了好多办法,但是都不行。最终找到了问题的原因:BaseWebAppMenu这个父类是一个抽象类,不能进行实例化。
|
|
这里简单看了一下什么是元组:一个容器对象,包含了多个对象,允许从容器中读取,不允许向里添加。
在repository中,我们需要通过角色获取所有的菜单,这时候我们使用了@Query这个注解,它在执行查询的时候会返回一个元组,元组中的对象就是实例化的基本菜单,但是基本菜单又不能实例化,所以就报出了上面的错误。
解决办法
解决的办法很简单,既然抽象类不能实例化,那么我们就不让他是抽象类不就行了。
总结
在这里我们虽然是成功的解决了问题,但是我们又不得不思考后面的问题:我们的历史数据怎么实现保存。所以,还是要权衡一下能不能使用这个办法。