1、使用layui的第三方插件时间菜单树状显示。(dtree)
2、使用SpringDataJpa进行一对多,保存操作的时候,遇到 failed to lazily initialize a collection of role,这是由于懒加载导致的,解决办法:在注解上添加fetch=FetchType.EAGER,如果不是用的注解,则在配置文件里修改lazy="false"。
3、解决完懒加载后,又遇到了空指针异常,报错指向的是我的实体类的data注解上(我用的lombok),查资料得知是lombok的原因,他的Data注解包括了@EqualsAndHashCode,这个注解默认是false的,他不继承父类的equals方法和hashcode方法,所以会造成两个对象比较出错,最后解决办法,我手动写set,get方法就可以,或者在@Data注解后面加一个@EqualsAndHashCode(callsuper = true)即可,(字面意思是打电话给父类哈哈,先就这么理解)lombok这个我会单独写一个帖子。
4、解决完上面问题之后,我开始查询了,又遇到了新的问题,我查询完的数据需要转换成json给前端,然后开始报stackoverflow栈溢出的错误,原因是对象死循环引用了,因为我a对象存储的List<b>,而b对象中又包含的a对象,所以一直进行对象引用,报错了。(json序列化的对象中存在双向引用会导致的无限递归)解决办法:使用@JsonBackRerence标记在有多对一或者多对多关系的属性上。(json如果这里被提到,就返回哈哈,先这么理解了)
5、前端传的json字符串,后端没办法接收,查看前端传递的是request payload请求,我使用request.getParammap()没有接收到,于是查资料找到这样的办法:
@RequestMapping("/roleMenuInsert/{roleId}") @ResponseBody public String roleMenuInsert(@PathVariable("roleId") Integer id, HttpServletRequest request){ StringBuilder sb = new StringBuilder(); try(BufferedReader reader = request.getReader();) { char[]buff = new char[1024]; int len; while((len = reader.read(buff)) != -1) { sb.append(buff,0, len); } }catch (IOException e) { e.printStackTrace(); } System.out.println(sb.toString()); return sb.toString() }
6、hibernate on-to-many 的级联操作解决步骤,在使用SpringDataJpa操作一对多修改的时候,role对象执行保存但不生效,
我原本的代码是
Role role = roleService.findById(1); Menu menu = menuService.findById(1); //我想把menu更新到role里面, Set<Menu> menuSet = new HashSet<>(); mentSet.add(menu); //然后我执行,不生效,爆出Don't dereference a collection with cascade="all-delete-orphan"的异常 role.setMenuS(menuset); roleService.save(role);
查资料后得知,对于role的menus这个set,它本身是一个持久的集合,该集合存在于hibernate的对象池中,通过role.setMenus(menuset)之后,将role对menu集合的引用指到对象池外的一个集合。最后解决办法:
Role role = roleService.findById(1); Menu menu = menuService.findById(1); //我想把menu更新到role里面, Set<Menu> menuSet = new HashSet<>(); menuSet.add(menu); role.getMenus().clear(); role.getMenus().addAll(menuSet);//着重注意这行 roleService.save(role);
7、orphanRemoval表示在删除主键对象的时候,外键对象是否要删除,一般默认是要删除的,所以我们在@OneToMany上加(orphanRemoval = false)true表示删除,删除改对象的同时,把引用的外键对象也删除。false表示不删除,只是将对象的引用设置为null,
8、在执行SpringDataJpa联级操作的时候,一定要维护两边的外键(两方的注解都必须有维护关系)