PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Hibernate Annotations - Case Insensitive UniqueConstraint

Ich würde vorschlagen, dieses Problem aus einem anderen Blickwinkel anzugehen:

  1. füge eine neue Spalte hinzu, interne, nenne sie lcname (steht für Name in Kleinbuchstaben)

    @NotEmpty
    @Column(nullable = false)
    private String lcname;
    
  2. Ändern Sie die Einschränkung, die Sie als Anmerkung festgelegt haben, um stattdessen das neue Feld zu verwenden:

    @Entity
    @Table(uniqueConstraints={@UniqueConstraint(columnNames={"lcname"})})
    public class Component extends Model {
        ...
    }
    
  3. Ändern Sie den Name-Setter, um auch lcname mit einem Kleinbuchstaben des ursprünglichen Namens zu setzen, der vom Client bereitgestellt wird

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

Das ist es. Jedes Mal, wenn die Entität beibehalten wird, wird auch ein Name in Kleinbuchstaben gespeichert. Auf diese Weise haben Sie, wenn Sie "A" speichern, einen Datensatz mit lcname ="a" gespeichert, und wenn Sie das nächste Mal versuchen, eine Entität mit dem Namen "a" zu speichern, schlägt die Operation aufgrund der Einschränkung für lcname fehl. Die Änderung ist vollständig transparent an jeden, der eine Entität aus der Datenbank abruft, da lcname privat ist und es keinen Getter dafür gibt, während der ursprüngliche getName den ursprünglichen Namen zurückgibt, wie er ursprünglich von dem Client bereitgestellt wurde, der ihn erstellt hat.