summaryrefslogtreecommitdiff
path: root/microservices/03-resource-server/src/main/java/com/example/resourceserver/security/User.java
diff options
context:
space:
mode:
Diffstat (limited to 'microservices/03-resource-server/src/main/java/com/example/resourceserver/security/User.java')
-rw-r--r--microservices/03-resource-server/src/main/java/com/example/resourceserver/security/User.java110
1 files changed, 110 insertions, 0 deletions
diff --git a/microservices/03-resource-server/src/main/java/com/example/resourceserver/security/User.java b/microservices/03-resource-server/src/main/java/com/example/resourceserver/security/User.java
new file mode 100644
index 0000000..8f84297
--- /dev/null
+++ b/microservices/03-resource-server/src/main/java/com/example/resourceserver/security/User.java
@@ -0,0 +1,110 @@
+package com.example.resourceserver.security;
+
+import java.time.LocalDateTime;
+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 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 {
+
+ /*
+ * 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;
+
+ /*
+ * @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"]
+
+ public String getPassword() {
+ return password;
+ }
+
+ 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 Set<String> getRoles() {
+ return roles;
+ }
+
+ public void setRoles(Set<String> roles) {
+ this.roles = roles;
+ }
+} \ No newline at end of file