I have a UserEntity and a RoleEntity. The UserEntity contains a field "roles" which is of type HashSet and annotated with the @ManyToMany annotation. When calling my custom query "findByEmail" it successfully fetches the UserEntity, but the roles set keeps empty.
Here some parts of the code:
package xyz.michaeltprojects.collchecklist.security.persistence;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
@Entity
@Table(name = "users")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class UserEntity {
@Id
@GeneratedValue
private UUID id;
@NotBlank
@Size(min = 3, max = 30)
private String username;
@NotBlank
@Size(min = 6, max = 50)
@Email
private String email;
@NotBlank
@Size(max = 120)
private String password;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<RoleEntity> roles = new HashSet<>();
}
package xyz.michaeltprojects.collchecklist.security.persistence;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import java.util.UUID;
@Entity
@Table(name = "roles")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class RoleEntity {
@Id
@GeneratedValue
private UUID id;
@Enumerated(EnumType.STRING)
@Column(length = 20)
private ERole name;
}
package xyz.michaeltprojects.collchecklist.security.persistence;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
import java.util.UUID;
@Repository
public interface UserRepository extends JpaRepository<UserEntity, UUID> {
Optional<UserEntity> findByEmail(String email);
Boolean existsByUsername(String username);
Boolean existsByEmail(String email);
}
I've somehow solved the issue... It seems that populating the relationships didn't work with UUIDs as identifiers. When I replaced them with longs it worked perfectly. Seems weird but it is like it is
You ManyToMany
is not correct, you need to reference the id of each table by using referencedColumnName
Take a look at this one:
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "user_roles",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
private Set<RoleEntity> roles;
Can you try this? by adding an override function setRoles(..) below the UserEntity calss
package xyz.michaeltprojects.collchecklist.security.persistence;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
@Entity
@Table(name = "users")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class UserEntity {
@Id
@GeneratedValue
private UUID id;
@NotBlank
@Size(min = 3, max = 30)
private String username;
@NotBlank
@Size(min = 6, max = 50)
@Email
private String email;
@NotBlank
@Size(max = 120)
private String password;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<RoleEntity> roles = new HashSet<>();
public UserEntity setRoles(final Set<RoleEntity> roles) {
this.roles.clear();
if (roles != null) {
this.roles.addAll(roles);
}
return this;
}
}
You have to remove new HashSet<>();
from the user entity.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.