blob: 5b65ad2e98ac918df35b68a9494634256d12f584 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
package com.example.spring.security.entity;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import jakarta.persistence.CollectionTable;
import jakarta.persistence.Column;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.Table;
/*
@Table - Used to set the database table name explicitely.
*/
@Entity
@Table(name = "user_account")
public class User implements UserDetails {
/*
* GenerationType.IDENTITY - Auto generate value based on database's native auto
* increment feature
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
private String username;
private String password;
@Column(nullable = false)
private String description;
@CreationTimestamp
@Column(updatable = false, name = "created_at")
private Date createdAt;
@UpdateTimestamp
@Column(name = "updated_at")
private Date updatedAt;
/*
* @ElementCollection: Marks the field as a collection of basic types (Strings,
* Integers, etc.) or embeddable objects.
*
* @CollectionTable: Customizes the junction table details. If omitted, JPA
* generates a default table name combining the entity name and the field name
* (e.g., User_roles).
*
* @Column: Defines the column name for the String values inside the collection
* table.
*
* Fetch Type: By default, element collections use FetchType.LAZY. If you access
* the set outside of an active transaction or Hibernate session, it throws a
* LazyInitializationException. You can switch it to fetch = FetchType.EAGER to
* load the strings immediately alongside the main entity.
*
*/
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "user_roles", // Name of the separate collection table
joinColumns = @JoinColumn(name = "user_id") // Foreign key linking back to this entity
)
@Column(name = "role_name") // Name of the column storing the actual String values
private Set<String> roles = new HashSet<>(); // e.g., ["ADMIN", "USER"]
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return roles.stream()
.map(role -> new SimpleGrantedAuthority("ROLE_" + role))
.collect(Collectors.toList());
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
public Date getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(Date updatedAt) {
this.updatedAt = updatedAt;
}
public Set<String> getRoles() {
return roles;
}
public void setRoles(Set<String> roles) {
this.roles = roles;
}
}
|