Hibernate Аннотации - без учета регистра UniqueConstraint - PullRequest
7 голосов
/ 27 октября 2010

У меня есть субъект, отмеченный следующим:

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"name"})})
public class Component extends Model {
    ...
}

Можно ли сделать регистр UniqueConstraint без учета регистра? Мы используем PostgreSQL.

Ответы [ 2 ]

10 голосов
/ 25 июня 2014

Я бы предложил атаковать эту проблему под другим углом:

  1. добавить новый столбец, внутренний, назвать его lcname (расшифровывается как имя в нижнем регистре)

    @NotEmpty
    @Column(nullable = false)
    private String lcname;
    
  2. измените ограничение, заданное вами в качестве аннотации, чтобы использовать вместо этого новое поле:

    @Entity
    @Table(uniqueConstraints={@UniqueConstraint(columnNames={"lcname"})})
    public class Component extends Model {
        ...
    }
    
  3. измените установщик имени, чтобы также задать lcname с более низкимрегистр оригинального имени, предоставленного клиентом

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

Вот и все.Каждый раз, когда сущность будет сохраняться, также будет сохранено имя в нижнем регистре.Таким образом, если вы сохраните «A», у вас будет сохранена запись с lcname = «a», и в следующий раз, когда вы попытаетесь сохранить сущность с именем «a», операция завершится неудачей из-за ограничения на lcname. Изменение полностьюПрозрачный для любого, кто выбирает сущность из базы данных, так как lcname является приватным, и для него нет получателя, в то время как исходный getName вернет оригинальное имя, предоставленное изначально клиентом, который его создал.

6 голосов
/ 28 октября 2010

С PostgreSQL вы действительно сделаете что-то подобное для реализации своего требования:

CREATE UNIQUE INDEX My_Index on Component (lower(name));

Но, насколько мне известно, нет способа добиться этого с помощью аннотаций.

Единственный вариантЯ могу подумать, хотите ли вы полагаться на инструмент hbm2ddl Hibernate для генерации схемы, и при этом созданный индекс будет использовать функцию import.sql .Из сообщения Rotterdam JBug и Hibernate import.sql :

import.sql: легко импортировать данные в свои юнит-тесты

Hibernate имеет изящную небольшую функциюэто сильно недокументировано и неизвестно.Вы можете выполнить сценарий SQL во время создания SessionFactory сразу после создания схемы базы данных, чтобы импортировать данные в новую базу данных.Вам просто нужно добавить файл с именем import.sql в корень пути к классам и установить create или create-drop в качестве свойства hibernate.hbm2ddl.auto.

Теперь я использую его для Hibernate Search in Action, когда у меня естьначал главу запроса.Он инициализирует мою базу данных свежим набором данных для моих модульных тестов.JBoss Seam также часто использует его в различных примерах.import.sql - это очень простая функция, но довольно полезная.Помните, что SQL может зависеть от вашей базы данных (ах переносимость!).

#import.sql file
delete from PRODUCTS
insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('1', '630522577X', 'My Fair Lady', 19.98, '630522577X.jpg', 'My Fair blah blah...');
insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('2', 'B00003CXCD', 'Roman Holiday ', 12.98, 'B00003CXCD.jpg', 'We could argue that blah blah');

Для получения дополнительной информации об этой функции, проверьте блог Eyal ( Обновленное местоположение для неработающей ссылки)), он написал хорошую небольшую запись об этом.Помните, что если вы хотите добавить дополнительные объекты базы данных (индексы, таблицы и т. Д.), Вы также можете использовать функцию вспомогательные объекты базы данных .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...