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 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 getRoles() { return roles; } public void setRoles(Set roles) { this.roles = roles; } }