spring boot 在进行权限管理时出现栈溢出

来源:互联网 发布:linux system函数阻塞 编辑:程序博客网 时间:2024/06/05 10:39

在下用的是jpa整合Hibernate

application.yml配置

spring:  profiles:    active: dev  datasource:    driver-class-name: com.mysql.jdbc.Driver    url: jdbc:mysql://127.0.0.1:3306/****    username: **    password: **jpa:    hibernate:      ddl-auto: update    show-sql: true


上面是权限管理用到的表 

下面放出三个实体采用JPA注解,实体均为关联实体

1 User实体

package com.example.demo.domain;import lombok.Data;import org.hibernate.validator.constraints.NotEmpty;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;import javax.persistence.Table;import javax.persistence.Transient;import java.util.HashSet;import java.util.Set;/** * @Author :zhanglu * @Description: * @Date :Created in 15:18 2017/11/13 * @Modified By: */@Entity@Table(name = "t_user")public @Dataclass User {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Integer id;    @NotEmpty(message = "用户名不能为空")    private String username;    @NotEmpty(message = "密码不能为空")    private String password;   // 将与他关联的书    @ManyToMany(fetch= FetchType.LAZY)    @JoinTable(name = "t_user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = {            @JoinColumn(name = "role_id") })    private Set<Role> roleList;// 一个用户具有多个角色    public User() {        super();    }    public User(String username, String password) {        super();        this.username = username;        this.password = password;    }    // 省略 get set 方法    @Transient    public Set<String> getRolesName() {        Set<Role> roles = getRoleList();        Set<String> set = new HashSet<String>();        for (Role role : roles) {            set.add(role.getRolename());        }        return set;    }}

2 Role实体

package com.example.demo.domain;import lombok.Data;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;import javax.persistence.OneToMany;import javax.persistence.Table;import javax.persistence.Transient;import java.util.HashSet;import java.util.Set;/** * @Author :zhanglu * @Description: * @Date :Created in 15:20 2017/11/13 * @Modified By: */@Entity@Table(name = "t_role")public @Dataclass Role {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Integer id;    private String rolename;    @OneToMany(mappedBy = "role", fetch= FetchType.EAGER)    private Set<Permission> permissionList;// 一个角色对应多个权限    @ManyToMany    @JoinTable(name = "t_user_role", joinColumns = { @JoinColumn(name = "role_id") }, inverseJoinColumns = {            @JoinColumn(name = "user_id") })    private Set<User> userList;// 一个角色对应多个用户    // 省略 get set 方法    @Transient    public Set<String> getPermissionsName() {        Set<String> list = new HashSet<>();        Set<Permission> perlist = getPermissionList();        for (Permission per : perlist) {            list.add(per.getPermissionname());        }        return list;    }}
3Permission

package com.example.demo.domain;import lombok.Data;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.Table;/** * @Author :zhanglu * @Description: * @Date :Created in 15:21 2017/11/13 * @Modified By: */@Entity@Table(name = "t_permission")public @Dataclass Permission {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Integer id;    private String permissionname;    @ManyToOne    @JoinColumn(name = "role_id")    private Role role;// 一个权限对应一个角色    // 省略 get set}

二Dao层


package com.example.demo.Repository;import com.example.demo.domain.User;import org.springframework.data.jpa.repository.JpaRepository;import java.util.List;/** * @Author :zhanglu * @Description: * @Date :Created in 13:59 2017/11/6 * @Modified By: */public interface UserRepository extends JpaRepository<User,Integer> {    public User findUserByUsername(String currentLoginName);    public List<User> findAll();}

三、Service

 public User findByLoginName(String currentLoginName){        return userRepository.findUserByUsername(currentLoginName);    }


Controler调用Service的时候就出现栈溢出


原因是我的实体里面查一个用户就必须差出他的角色,查出角色又要查权限,而角色又要查用户,而用户名是无法查出角色的,id才可以此时栈存的就只是角色的引用,就发生了栈溢出。

最后,建议关联表多就不要用jpa的toMany等注解。


原创粉丝点击