2020-04-12工作记录

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联级操作的时候,一定要维护两边的外键(两方的注解都必须有维护关系)

原文地址:https://www.cnblogs.com/super-hu/p/12687868.html