mirror of
https://git.imnavajas.es/jjimenez/erp-imprimelibros.git
synced 2026-02-01 00:28:51 +00:00
implementado el soft-delete
This commit is contained in:
121
src/main/java/com/imprimelibros/erp/users/UserRole.java
Normal file
121
src/main/java/com/imprimelibros/erp/users/UserRole.java
Normal file
@ -0,0 +1,121 @@
|
||||
package com.imprimelibros.erp.users;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import org.hibernate.annotations.SQLDelete;
|
||||
import org.hibernate.annotations.SQLRestriction;
|
||||
|
||||
@Entity
|
||||
@Table(name = "users_roles", uniqueConstraints = {
|
||||
@UniqueConstraint(name = "ux_users_roles_active", columnNames = { "user_id", "role_id", "deleted" })
|
||||
})
|
||||
@SQLDelete(sql = "UPDATE users_roles SET deleted = TRUE, deleted_at = NOW() WHERE id = ?")
|
||||
@SQLRestriction("deleted = false")
|
||||
public class UserRole {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
// FK a users
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "user_id", nullable = false)
|
||||
private User user;
|
||||
|
||||
// FK a roles
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "role_id", nullable = false)
|
||||
private Role role;
|
||||
|
||||
@Column(nullable = false)
|
||||
private boolean deleted = false;
|
||||
|
||||
@Column(name = "deleted_at")
|
||||
private LocalDateTime deletedAt;
|
||||
|
||||
protected UserRole() {
|
||||
}
|
||||
|
||||
public UserRole(User user, Role role) {
|
||||
this.user = user;
|
||||
this.role = role;
|
||||
}
|
||||
|
||||
/* ---- helpers ---- */
|
||||
public void softDelete() {
|
||||
this.deleted = true;
|
||||
this.deletedAt = LocalDateTime.now();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o)
|
||||
return true;
|
||||
if (!(o instanceof UserRole other))
|
||||
return false;
|
||||
|
||||
Long u1 = this.getUser() != null ? this.getUser().getId() : null;
|
||||
Long r1 = this.getRole() != null ? this.getRole().getId() : null;
|
||||
Long u2 = other.getUser() != null ? other.getUser().getId() : null;
|
||||
Long r2 = other.getRole() != null ? other.getRole().getId() : null;
|
||||
|
||||
// igualdad por clave lógica (user_id, role_id) cuando existen
|
||||
if (u1 != null && r1 != null && u2 != null && r2 != null) {
|
||||
return u1.equals(u2) && r1.equals(r2);
|
||||
}
|
||||
// fallback: identidad por id si está asignado
|
||||
if (this.getId() != null && other.getId() != null) {
|
||||
return this.getId().equals(other.getId());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
Long u = this.getUser() != null ? this.getUser().getId() : null;
|
||||
Long r = this.getRole() != null ? this.getRole().getId() : null;
|
||||
if (u != null && r != null) {
|
||||
return java.util.Objects.hash(u, r);
|
||||
}
|
||||
return java.util.Objects.hash(getId());
|
||||
}
|
||||
|
||||
/* ---- getters/setters ---- */
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public User getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public void setUser(User user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public Role getRole() {
|
||||
return role;
|
||||
}
|
||||
|
||||
public void setRole(Role role) {
|
||||
this.role = role;
|
||||
}
|
||||
|
||||
public boolean isDeleted() {
|
||||
return deleted;
|
||||
}
|
||||
|
||||
public void setDeleted(boolean deleted) {
|
||||
this.deleted = deleted;
|
||||
}
|
||||
|
||||
public LocalDateTime getDeletedAt() {
|
||||
return deletedAt;
|
||||
}
|
||||
|
||||
public void setDeletedAt(LocalDateTime deletedAt) {
|
||||
this.deletedAt = deletedAt;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user