项目学习
1.部门(所有子部门的查询) 递归
/** * findByPid * @param id * @return */ List<Dept> findByPid(Long id);
public List<Long> getDeptChild(List<Dept> deptList) {
List<Long> list = new ArrayList<>();
deptList.forEach(dept -> {
if (dept!=null){//这里还可以添加限制
List<Dept> depts = deptService.findByPid(dept.getId());
if(deptList!=null && deptList.size()!=0){
list.addAll(getDeptChild(depts));
}
list.add(dept.getId());
}
}
);
return list;
}
public List<Long> getDeptChildren(List<Dept> deptList) {
List<Long> list = new ArrayList<>();
deptList.forEach(dept -> {
if (dept!=null && dept.getEnabled()){
List<Dept> depts = deptService.findByPid(dept.getId());
if(deptList!=null && deptList.size()!=0){
list.addAll(getDeptChildren(depts));
}
list.add(dept.getId());
}
}
);
return list;
}
2.缓存Redis
Spring使用Cache、整合Ehcache https://blog.csdn.net/weixin_30239339/article/details/95456815
springboot(7)集成缓存技术之Redis https://blog.csdn.net/zhaocuit/article/details/84030055
3.懒加载与级联操作
3.1@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL)//三种与5种
3.2@OneToMany描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段.
fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存
cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新删除
3.3 cascade属性的可能值 https://blog.csdn.net/qq_32953079/article/details/53858728
3.4 fetch = FetchType.EAGER https://blog.csdn.net/sunqing0316/article/details/43852501
3.5 Hibernate延迟加载策略, 也就是用到的时候才去加载.这样可以提高一些性能.
Hibernate的lazy loading 采用了一个HibernateSession来管理session,它的逻辑是每进行一次数据库操作,就开新的session,操作完成后立即关闭该session。这样做的好处是可以严格关闭session,避免菜鸟级的错误,但是并不推荐这么做。因为这不适合lazy loading,也不适合跨方法的事务。
比如在我们的应用中,user->article 形成一对多的映射,User 中有一个包含 article 的List。
在User中,有多个属性:name,password,phone等,还有一个 List 类型的 articleList。当我们对 article 使用 lazy laoding 的时候,hibernate会在获得 User 对象的时候,仅仅返回 name,password,phone 等基本属性,当你访问 articleList 的时候,它才会从数据库中提取 articleList 需要的数据,这就是所谓lazy laoding。但是在我们的系统中,session是被立即关闭的,也就是在读取了name,password,phone等基本属性后,session 已经 close了,再进行 lazy loaiding 就会有异常。
3.6 spring data jpa 多对多关系
https://www.cnblogs.com/hhhshct/p/9492741.html spring data jpa关联查询(一对一、一对多、多对多)
https://www.cnblogs.com/xwgcxk/p/9712153.html Spring Boot中@OneToMany与@ManyToOne几个需要注意的问题
https://www.jianshu.com/p/3258bc2b2d26 Spring Data JPA中常见的关系映射之一对多关系
3.7级联
https://www.cnblogs.com/fuzhihong0917/p/6653847.html Hibernate 一对一、一对多、多对多注解mappedBy属性的总结
oneToone级联添加 (Spring Data Jpa):
1.控制层处理
BankCardEntry bankCardEntry=user.getBankCardEntry();
bankCardEntry.setUser(user);
bankCardRepository.save(bankCardEntry);
return userMapper.toDto(userRepository.save(user));
2.实体写法(两边级联)
user实体
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "BANK_ID")
private BankCardEntry bankCardEntry;
bankCardEntry实体
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private User user;
@Override//jpa分页使用
public Object queryAll(Pageable pageable) {
Page p=projectRepository.findAll(new Specification<ProjectEntry>() {
@Override
public Predicate toPredicate(Root<ProjectEntry> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
Predicate predicate = cb.conjunction();
predicate = cb.and(predicate, cb.notEqual(root.get("status"), "8"));
return predicate;
}
}, pageable);
return p;
}
https://blog.csdn.net/qq373223330/article/details/91527768 一些优秀·的项目