Использование уникального ограничения на Hibernate JPA2

Как я могу реализовать свои уникальные ограничения на POJO в спящем режиме? предполагая, что в базе данных их нет.

Я видел уникальный атрибут в аннотации @Column(), но не смог заставить его работать?
Что делать, если я хочу применить это ограничение более чем к одному столбцу?


person Feras Odeh    schedule 28.12.2010    source источник
comment
это C в @Column, а не c !!!   -  person KNU    schedule 01.04.2014


Ответы (3)


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

Атрибуты @UniqueConstraint и unique элемента @Column являются инструкциями для инструмента генерации схемы для создания соответствующих ограничений, они сами не реализуют ограничения.

Вы можете выполнить некоторую ручную проверку перед вставкой новых сущностей, но в этом случае вы должны знать о возможных проблемах с параллельными транзакциями.

Поэтому применение ограничений в базе данных является предпочтительным выбором.

person axtavt    schedule 28.12.2010
comment
Таким образом, приложение не будет применять уникальные ограничения, если БД явно не добавит его? Я предполагаю, что ddl выключен - person Kevin Meredith; 30.07.2014

Вы можете объявить уникальные ограничения, используя аннотацию @Table(uniqueConstraints = ...) в своем классе.

@Entity
@Table(uniqueConstraints=
           @UniqueConstraint(columnNames = {"surname", "name"})) 
public class SomeEntity {
    ...
}
person Hons    schedule 28.12.2010
comment
Я пытался использовать его, но затмение не смогло идентифицировать эту аннотацию. - person Feras Odeh; 28.12.2010
comment
Который из? @UniqueConstraint? Этот исходит от javax.persistence.UniqueConstraint - person Hons; 28.12.2010
comment
Вы добавили его с помощью аннотации? Какую БД вы используете (если у вас есть инструмент визуализации, такой как pgadmin для postresql, проверьте, есть ли ограничение в таблице)? Использовали ли вы логические имена столбцов для определения ограничения? - person Hons; 28.12.2010
comment
Предполагая, что id уже является первичным ключом, этот пример неверен. уникальный (идентификатор, имя) слабее, чем уникальный (идентификатор), и слабее, чем уникальный (имя). Лучшим примером может быть уникальный (имя, фамилия). - person Robert Hensing; 15.07.2013

В JPA2 вы можете добавить ограничение Unique непосредственно в поле:

@Entity
@Table(name="PERSON_TABLE") 
public class Person{
  @Id
  @Column(name = "UUID")
  private String id;

  @Column(name = "SOCIALSECURITY", unique=true)
  private String socialSecurityNumber;

  @Column(name = "LOGINID", unique=true)
  private String loginId;
}

ИМХО, гораздо лучше назначать уникальное ограничение непосредственно атрибутам, чем в начале таблицы.

Однако, если вам нужно объявить составной уникальный ключ, то объявление его в аннотации @table — ваш единственный вариант.

person will824    schedule 15.04.2011
comment
Является ли это уникальным ограничением для одного столбца или это уникальное ограничение для комбинации socialSecurityNumber и loginId? - person Stephan Schielke; 22.02.2012
comment
@StephanSchielke Это создает отдельное уникальное ограничение для каждого столбца. Чтобы создать уникальное ограничение для нескольких полей, вам нужно использовать подход Хонса. - person Naliba; 25.09.2012