View Javadoc
1   package pk.lucidxpo.ynami.persistence.model.security;
2   
3   import jakarta.persistence.Entity;
4   import jakarta.persistence.JoinColumn;
5   import jakarta.persistence.JoinTable;
6   import jakarta.persistence.ManyToMany;
7   import jakarta.persistence.Table;
8   import jakarta.persistence.UniqueConstraint;
9   import jakarta.validation.constraints.Email;
10  import jakarta.validation.constraints.NotBlank;
11  import jakarta.validation.constraints.Size;
12  import lombok.Data;
13  import lombok.EqualsAndHashCode;
14  import lombok.NoArgsConstructor;
15  import lombok.ToString;
16  import org.hibernate.annotations.NaturalId;
17  import pk.lucidxpo.ynami.persistence.model.Auditable;
18  
19  import java.util.Set;
20  
21  import static com.google.common.collect.Sets.newHashSet;
22  import static jakarta.persistence.FetchType.LAZY;
23  import static lombok.AccessLevel.PACKAGE;
24  
25  @Data
26  @Entity
27  @ToString(callSuper = true)
28  @EqualsAndHashCode(callSuper = true)
29  @Table(name = "Users", uniqueConstraints = {
30          @UniqueConstraint(columnNames = {
31                  "username"
32          }),
33          @UniqueConstraint(columnNames = {
34                  "email"
35          })
36  })
37  // TODO: Spring Upgrade - added to fix the IT, but do I really need to add?
38  @NoArgsConstructor(access = PACKAGE)
39  public class User extends Auditable<String> {
40  
41      @NotBlank
42      @Size(max = 40)
43      private String name;
44  
45      @NotBlank
46      @Size(max = 40)
47      private String username;
48  
49      @NaturalId
50      @NotBlank
51      @Size(max = 40)
52      @Email
53      private String email;
54  
55      @NotBlank
56      @Size(max = 100)
57      private String password;
58  
59      @ManyToMany(fetch = LAZY)
60      @JoinTable(name = "UserRoles",
61              joinColumns = @JoinColumn(name = "userId"),
62              inverseJoinColumns = @JoinColumn(name = "roleId"))
63      private Set<Role> roles = newHashSet();
64  
65      public User(final String name,
66                  final String username,
67                  final String email,
68                  final String password) {
69          this.name = name;
70          this.username = username;
71          this.email = email;
72          this.password = password;
73      }
74  }