项目心得(五)——抽象类

在实际的项目中我们经常会遇到两个实体关系是多对多的,这个时候同长会有一张用来维护实体关系的中间表。这次我就遇到了一个多对多的问题,而且其中还掺杂了抽象类干扰。

问题描述

两个实体:角色和菜单,多对多关联,由一张中间表来维护。现在要修改其中其中菜单的关联,将菜单换成他的基类菜单。出现问题的位置:通过角色获取所有的菜单。

解决过程

修改实体对应的关系这个比较简单,但在进行查询操作的时候就出现了问题。我们都知道,在通过角色获取所有菜单的时候,必然要通过中间表来找到对应的菜单。这时候报错出现了:

可以看到,报错中说不能从元组中实例化BaseWebAppMenu这个类从。原因是什么呢?

中间Google了好多办法,但是都不行。最终找到了问题的原因:BaseWebAppMenu这个父类是一个抽象类,不能进行实例化。

1
2
@Query(value = "SELECT new BaseWebAppMenu(w.baseWebAppMenu.id) FROM UserRole u, WebAppMenuRole w where w.role.id = u.role.id and u.user.id=?1")
List<BaseWebAppMenu> findAllByUserId(Long userId);

这里简单看了一下什么是元组:一个容器对象,包含了多个对象,允许从容器中读取,不允许向里添加。

在repository中,我们需要通过角色获取所有的菜单,这时候我们使用了@Query这个注解,它在执行查询的时候会返回一个元组,元组中的对象就是实例化的基本菜单,但是基本菜单又不能实例化,所以就报出了上面的错误。

解决办法

解决的办法很简单,既然抽象类不能实例化,那么我们就不让他是抽象类不就行了。

总结

在这里我们虽然是成功的解决了问题,但是我们又不得不思考后面的问题:我们的历史数据怎么实现保存。所以,还是要权衡一下能不能使用这个办法。

坚持原创技术分享,您的支持将鼓励我继续创作!