hibernate中pojo映射,死循环

2018-04-24 10:19:17.394 ERROR 20232 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: 

com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->com.boot.demo.entity.SysRoleMenu["sysRole"])] with root cause

SysRoleMenu的pojo如下:

@Entity
@Table(name = "sys_role_menu")
public class SysRoleMenu implements Serializable{
    private static final long serialVersion = 1L;
    private long grantId;
   /* private Long roleKy;
    private Long menuKy;*/
    private Integer status;
    private SysRole sysRole;
    private SysMenu sysMenu;

    @Id
    @Column(name = "grant_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long getGrantId() {
        return grantId;
    }

    public void setGrantId(long grantId) {
        this.grantId = grantId;
    }

    /*@Basic
    @Column(name = "role_ky")
    public Long getRoleKy() {
        return roleKy;
    }

    public void setRoleKy(Long roleKy) {
        this.roleKy = roleKy;
    }

    @Basic
    @Column(name = "menu_ky")
    public Long getMenuKy() {
        return menuKy;
    }

    public void setMenuKy(Long menuKy) {
        this.menuKy = menuKy;
    }*/

    @Basic
    @Column(name = "status")
    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    @Basic
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "role_ky")
    public SysRole getSysRole() {
        return sysRole;
    }

    public void setSysRole(SysRole sysRole) {
        this.sysRole = sysRole;
    }

    @Basic
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "menu_ky")
    public SysMenu getSysMenu() {
        return sysMenu;
    }

    public void setSysMenu(SysMenu sysMenu) {
        this.sysMenu = sysMenu;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        SysRoleMenu that = (SysRoleMenu) o;

        if (grantId != that.grantId) return false;
        //if (roleKy != null ? !roleKy.equals(that.roleKy) : that.roleKy != null) return false;
        //if (menuKy != null ? !menuKy.equals(that.menuKy) : that.menuKy != null) return false;
        if (status != null ? !status.equals(that.status) : that.status != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = (int) (grantId ^ (grantId >>> 32));
       // result = 31 * result + (roleKy != null ? roleKy.hashCode() : 0);
        //result = 31 * result + (menuKy != null ? menuKy.hashCode() : 0);
        result = 31 * result + (status != null ? status.hashCode() : 0);
        return result;
    }
}
@Entity
@Table(name = "sys_role")
public class SysRole implements Serializable{
    private static final long serialVersion = 1L;
    private long roleKy;
    private String code;
    private String name;
    private Integer status;
    private String remark;
    private Set<SysRoleMenu> sysRoleMenus = new HashSet<>();
   /* private Set<SysUserRole> sysUserRoles = new HashSet<>();*/

    @Id
    @Column(name = "role_ky")
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long getRoleKy() {
        return roleKy;
    }

    public void setRoleKy(long roleKy) {
        this.roleKy = roleKy;
    }

    @Basic
    @Column(name = "code")
    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Basic
    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Basic
    @Column(name = "status")
    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    @Basic
    @Column(name = "remark")
    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

   @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "sysRole")
    public Set<SysRoleMenu> getSysRoleMenus() {
        return sysRoleMenus;
    }

    public void setSysRoleMenus(Set<SysRoleMenu> sysRoleMenus) {
        this.sysRoleMenus = sysRoleMenus;
    }

    //@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "sysRole")
    /*public Set<SysUserRole> getSysUserRoles() {
        return sysUserRoles;
    }

    public void setSysUserRoles(Set<SysUserRole> sysUserRoles) {
        this.sysUserRoles = sysUserRoles;
    }*/

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        SysRole sysRole = (SysRole) o;

        if (roleKy != sysRole.roleKy) return false;
        if (code != null ? !code.equals(sysRole.code) : sysRole.code != null) return false;
        if (name != null ? !name.equals(sysRole.name) : sysRole.name != null) return false;
        if (status != null ? !status.equals(sysRole.status) : sysRole.status != null) return false;
        if (remark != null ? !remark.equals(sysRole.remark) : sysRole.remark != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = (int) (roleKy ^ (roleKy >>> 32));
        result = 31 * result + (code != null ? code.hashCode() : 0);
        result = 31 * result + (name != null ? name.hashCode() : 0);
        result = 31 * result + (status != null ? status.hashCode() : 0);
        result = 31 * result + (remark != null ? remark.hashCode() : 0);
        return result;
    }
}
@Entity
@Table(name = "sys_menu")
public class SysMenu implements Serializable{
    private static final long serialVersion = 1L;
    private long menuKy;
    private String name;
    private String url;
    private Integer parent;
    private String image;
    private Integer grade;
    private Integer position;
    private Integer status;
    private Integer itsSystem;
    private Set<SysRoleMenu> sysRoleMenus = new HashSet<>();

    @Id
    @Column(name = "menu_ky")
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long getMenuKy() {
        return menuKy;
    }

    public void setMenuKy(long menuKy) {
        this.menuKy = menuKy;
    }

    @Basic
    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Basic
    @Column(name = "url")
    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    @Basic
    @Column(name = "parent")
    public Integer getParent() {
        return parent;
    }

    public void setParent(Integer parent) {
        this.parent = parent;
    }

    @Basic
    @Column(name = "image")
    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    @Basic
    @Column(name = "grade")
    public Integer getGrade() {
        return grade;
    }

    public void setGrade(Integer grade) {
        this.grade = grade;
    }

    @Basic
    @Column(name = "position")
    public Integer getPosition() {
        return position;
    }

    public void setPosition(Integer position) {
        this.position = position;
    }

    @Basic
    @Column(name = "status")
    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    @Basic
    @Column(name = "itsSystem")
    public Integer getItsSystem() {
        return itsSystem;
    }

    public void setItsSystem(Integer itsSystem) {
        this.itsSystem = itsSystem;
    }

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "sysMenu")
    public Set<SysRoleMenu> getSysRoleMenus() {
        return sysRoleMenus;
    }

    public void setSysRoleMenus(Set<SysRoleMenu> sysRoleMenus) {
        this.sysRoleMenus = sysRoleMenus;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        SysMenu sysMenu = (SysMenu) o;

        if (menuKy != sysMenu.menuKy) return false;
        if (name != null ? !name.equals(sysMenu.name) : sysMenu.name != null) return false;
        if (url != null ? !url.equals(sysMenu.url) : sysMenu.url != null) return false;
        if (parent != null ? !parent.equals(sysMenu.parent) : sysMenu.parent != null) return false;
        if (image != null ? !image.equals(sysMenu.image) : sysMenu.image != null) return false;
        if (grade != null ? !grade.equals(sysMenu.grade) : sysMenu.grade != null) return false;
        if (position != null ? !position.equals(sysMenu.position) : sysMenu.position != null) return false;
        if (status != null ? !status.equals(sysMenu.status) : sysMenu.status != null) return false;
        if (itsSystem != null ? !itsSystem.equals(sysMenu.itsSystem) : sysMenu.itsSystem != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = (int) (menuKy ^ (menuKy >>> 32));
        result = 31 * result + (name != null ? name.hashCode() : 0);
        result = 31 * result + (url != null ? url.hashCode() : 0);
        result = 31 * result + (parent != null ? parent.hashCode() : 0);
        result = 31 * result + (image != null ? image.hashCode() : 0);
        result = 31 * result + (grade != null ? grade.hashCode() : 0);
        result = 31 * result + (position != null ? position.hashCode() : 0);
        result = 31 * result + (status != null ? status.hashCode() : 0);
        result = 31 * result + (itsSystem != null ? itsSystem.hashCode() : 0);
        return result;
    }
}

以上错误是由于在SysRole的pojo中引用了private Set<SysRoleMenu> sysRoleMenus = new HashSet<>();

并且SysRoleMenu的pojo中引用了private SysRole sysRole; 

SQL语句如下:

@Query(value = "select smr.sysMenu from SysRoleMenu smr where smr.sysRole.roleKy=:roleKy")
List<SysMenu> findMenuByRole(@Param("roleKy")Long roleKy);

查询的中造成了死循环,改之后就是将SysRole类中private Set<SysRoleMenu> sysRoleMenus = new HashSet<>();去掉,

SysMenu类中的private Set<SysRoleMenu> sysRoleMenus = new HashSet<>();去掉,

只保留SysRoleMenu类中的private SysRole sysRole; 和 private SysMenu sysMenu ;

重新启动再跑一遍就没有问题了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值