0
votes

I am trying to create a simple login with roles in Spring Boot.

I have a User class:

package com.codecool.domain;


import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import javax.persistence.*;
import java.util.Set;

@Data
@Entity
@Table(name="users")
@Slf4j
public class User {

@Id
@Column(name="user_id", unique = true)
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

@Column(name="email")
private String email;

@Column(name="password")
private String password;

@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="user_role", joinColumns =         @JoinColumn(name="user_id"), inverseJoinColumns = @JoinColumn(name="role_id"))
private Set<Role> roles;

private User(){}

public User(String email, String password, Set<Role> roles) {
    this.email = email;
    this.password = password;
    this.roles = roles;
}

}

... and a Role class:

package com.codecool.domain;


import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import javax.persistence.*;
import java.util.Set;

@Data
@Entity
@Table(name="role")
@Slf4j
public class Role {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToMany(mappedBy = "roles", fetch=FetchType.EAGER)
    private Set<User> users;

    private Role(){}

    public Role(String name){
        this.name = name;
    }
}

Whenever I try to log in through login.html I get into an infinite loop with the following error messages:

2017-03-12 13:26:17.872 INFO 8794 --- [io-8080-exec-10] o.h.h.i.QueryTranslatorFactoryInitiator : HHH000397: Using ASTQueryTranslatorFactory Hibernate: select user0_.user_id as user_id1_2_, user0_.email as email2_2_, user0_.password as password3_2_ from users user0_ where user0_.email=? Hibernate: select roles0_.user_id as user_id1_1_0_, roles0_.role_id as role_id2_1_0_, role1_.id as id1_0_1_, role1_.name as name2_0_1_ from user_role roles0_ inner join role role1_ on roles0_.role_id=role1_.id where roles0_.user_id=? Hibernate: select users0_.role_id as role_id2_1_0_, users0_.user_id as user_id1_1_0_, user1_.user_id as user_id1_2_1_, user1_.email as email2_2_1_, user1_.password as password3_2_1_ from user_role users0_ inner join users user1_ on users0_.user_id=user1_.user_id where users0_.role_id=? Hibernate: select roles0_.user_id as user_id1_1_0_, roles0_.role_id as role_id2_1_0_, role1_.id as id1_0_1_, role1_.name as name2_0_1_ from user_role roles0_ inner join role role1_ on roles0_.role_id=role1_.id where roles0_.user_id=? Hibernate: select users0_.role_id as role_id2_1_0_, users0_.user_id as user_id1_1_0_, user1_.user_id as user_id1_2_1_, user1_.email as email2_2_1_, user1_.password as password3_2_1_ from user_role users0_ inner join users user1_ on users0_.user_id=user1_.user_id where users0_.role_id=? Hibernate: select roles0_.user_id as user_id1_1_0_, roles0_.role_id as role_id2_1_0_, role1_.id as id1_0_1_, role1_.name as name2_0_1_ from user_role roles0_ inner join role role1_ on roles0_.role_id=role1_.id where roles0_.user_id=? Hibernate: select users0_.role_id as role_id2_1_0_, users0_.user_id as user_id1_1_0_, user1_.user_id as user_id1_2_1_, user1_.email as email2_2_1_, user1_.password as password3_2_1_ from user_role users0_ inner join users user1_ on users0_.user_id=user1_.user_id where users0_.role_id=? Hibernate: select roles0_.user_id as user_id1_1_0_, roles0_.role_id as role_id2_1_0_, role1_.id as id1_0_1_, role1_.name as name2_0_1_ from user_role roles0_ inner join role role1_ on roles0_.role_id=role1_.id where roles0_.user_id=? Hibernate: select users0_.role_id as role_id2_1_0_, users0_.user_id as user_id1_1_0_, user1_.user_id as user_id1_2_1_, user1_.email as email2_2_1_, user1_.password as password3_2_1_ from user_role users0_ inner join users user1_ on users0_.user_id=user1_.user_id where users0_.role_id=?

Any ideas what I am missing?

2

2 Answers

2
votes

When you want return object in RestController , object serialize to json .Spring using jackson to serialize .for solve this problem you want to jsonignore user or roles for example ignore users in Role.java

@Data
@Entity
@Table(name="role")
@Slf4j
public class Role {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToMany(mappedBy = "roles", fetch=FetchType.EAGER)
    @JsonIgnore
    private Set<User> users;

    private Role(){}

    public Role(String name){
        this.name = name;
    }
}
0
votes

Use lazy loading

@ManyToMany(mappedBy = "roles", fetch=FetchType.LAZY)
private Set<User> users;

And having users in the Role is not a good idea. Better to remove this field.