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

  • 相关阅读:
    Spring boot项目搭建及简单实例
    nodejs的web开发框架之express(其中项目的案例也是后端渲染)
    node的系统核心模块实现服务器功能、用nodejs做动态网站(后端渲染)
    nodejs包管理工具npm 、yarn
    node的基本操作、文件路径、文件读、取、目录读取删
    了解node、ES6
    相对单位em、rem
    响应式开发---网页的布局方式、媒体查询、栅格化布局、less语言
    移动端插件的使用---zepto、iScroll、swiper、swipe、fastclick
    base.css
  • 原文地址:https://www.cnblogs.com/super-hu/p/12687868.html
Copyright © 2020-2023  润新知