I working with Spring and I have developed two entities: Role and User with a ManyToMany relation between them. The related classes of my project are the following ones:
Entities
@Entity
@Table(name = "UTILISATEURS")
public class Utilisateur {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String username;
private String password;
private String email;
@ManyToMany(mappedBy = "utilisateurs")
private Set<Role> roles = new HashSet<Role>();
public Utilisateur() {
super();
}
public void addRole(Role role) {
this.roles.add(role);
}
// Getters and setters
}
@Entity
@Table(name = "ROLES")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "UTILISATEURS_ROLES", joinColumns = @JoinColumn(name = "ROLE_ID"), inverseJoinColumns = @JoinColumn(name = "UTILISATEUR_ID"))
private Set<Utilisateur> utilisateurs = new HashSet<Utilisateur>();
public Role(String name) {
this.name = name;
}
public void addUtilisateurs(Utilisateur user) {
this.utilisateurs.add(user);
}
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "UTILISATEURS_ROLES", joinColumns = @JoinColumn(name = "ROLE_ID"), inverseJoinColumns = @JoinColumn(name = "UTILISATEUR_ID"))
public Set<Utilisateur> getUtilisateurs() {
return utilisateurs;
}
// Getters and setters
}
Repositories:
public interface RoleRepository extends JpaRepository<Role, Long> {
}
public interface UtilisateurRepository extends JpaRepository<Utilisateur, Long> {
}
Main application:
@SpringBootApplication
public class ContactsApplication implements CommandLineRunner {
@Autowired
UtilisateurRepository utilisateurRepository;
@Autowired
RoleRepository roleRepository;
public static void main(String[] args) {
SpringApplication.run(ContactsApplication.class, args);
}
@Override
public void run(String... arg0) throws Exception {
Utilisateur user1 = new Utilisateur();
user1.setEmail("jl@mymail1.com");
user1.setPassword("mypass1");
user1.setUsername("myUser1");
Role role1 = new Role("ADMIN");
roleRepository.save(role1);
role1.addUtilisateurs(user1);
Set<Role> userRole1 = new HashSet<Role>();
userRole1.add(role1);
user1.addRole(role1);
utilisateurRepository.save(user1);
Utilisateur user2 = new Utilisateur();
user2.setEmail("jl@mymail2.com");
user2.setPassword("mypass2");
user2.setUsername("myUser2");
Role role2 = new Role("USER");
roleRepository.save(role2);
role2.addUtilisateurs(user2);
Set<Role> userRole2 = new HashSet<Role>();
userRole2.add(role2);
user2.setRoles(userRole2);
user2.addRole(role2);
utilisateurRepository.save(user2);
}
}
Controller:
@RestController
@CrossOrigin("*")
public class UtilisateurRestService {
@Autowired
private UtilisateurRepository utilisateurRepository;
@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<Utilisateur> getUtilisateurs() {
return utilisateurRepository.findAll();
}
}
When I invoke the endpoint http://localhost:8080/users, I receive the following results (with empty roles):
[
{
"id": 1,
"username": "myUser1",
"password": "mypass1",
"email": "jl@mymail1.com",
"roles": []
},
{
"id": 2,
"username": "myUser2",
"password": "mypass2",
"email": "jl@mymail2.com",
"roles": []
}
]
Have you any idea what my roles arrays are empty? It should contains one role(admin) for the first and role(user) for the second.