PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Annotazioni di sospensione - Vincolo unico senza distinzione tra maiuscole e minuscole

Suggerirei di affrontare questo problema da un'angolazione diversa:

  1. aggiungi una nuova colonna, interna, chiamala lcname (sta per nome in minuscolo)

    @NotEmpty
    @Column(nullable = false)
    private String lcname;
    
  2. cambia il vincolo che hai impostato come annotazione per utilizzare invece il nuovo campo :

    @Entity
    @Table(uniqueConstraints={@UniqueConstraint(columnNames={"lcname"})})
    public class Component extends Model {
        ...
    }
    
  3. modificare il name setter per impostare anche lcname con una minuscola del nome originale fornito dal client

    public void setName(String name) {
        this.name = name;
        this.lcname = name.toLowerCase();
    }
    

Questo è tutto. Ogni volta che l'entità verrà resa persistente, verrà salvato anche un nome in minuscolo. In questo modo se salvi "A" avrai un record con lcname ="a" salvato, e la prossima volta che proverai a salvare un'entità con nome "a" l'operazione fallirà a causa del vincolo su lcname La modifica è completamente trasparente a chiunque prenda un'entità dal database poiché lcname è privato e non esiste un getter per esso, mentre getName originale restituirà il nome originale fornito inizialmente dal client che lo ha creato.