@UniqueConstraint аннотация в Java


169

У меня есть боб Java. Теперь я хочу быть уверен, что поле должно быть уникальным.

Я использую следующий код:

@UniqueConstraint(columnNames={"username"})
public String username;

Но я получаю некоторую ошибку:

@UniqueConstraint is dissallowed for this location

Как правильно использовать уникальные ограничения?

Примечание: я использую игровые рамки.


15
"Но я получаю некоторую ошибку." Всегда указывайте, какую ошибку вы получаете в вопросе. У вас есть соответствующая информация, которая может помочь нам решить вашу проблему - не храните ее при себе.
Джон Скит

Можно ли использовать аннотацию @id?
Albinoswordfish

Ответы:


415

Чтобы убедиться, что значение поля уникально, вы можете написать

@Column(unique=true)
String username;

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

Рекомендации (JPA TopLink):


17
Важно отметить, что это будет работать, только если вы позволите JPA создавать свои таблицы
naoru

118

Вы можете использовать на уровне класса со следующим синтаксисом

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"username"})})
public class SomeEntity {
    @Column(name = "username")
    public String username;
}

42

В настоящее время я использую игровой фреймворк с hibernate и аннотацией JPA 2.0, и эта модель работает без проблем.

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames = {"id_1" , "id_2"})})
public class class_name {

@Id
@GeneratedValue
public Long id;

@NotNull
public Long id_1;

@NotNull
public Long id_2;

}

Надеюсь, это помогло.


20

Примечание: в Kotlin синтаксис для объявления массивов в аннотациях использует arrayOf(...)вместо{...}

@Entity
@Table(uniqueConstraints=arrayOf(UniqueConstraint(columnNames=arrayOf("book", "chapter_number"))))
class Chapter(@ManyToOne var book:Book,
              @Column var chapterNumber:Int)

Примечание. Начиная с Kotlin 1.2 можно использовать [...]синтаксис, чтобы код стал намного проще

@Entity
@Table(uniqueConstraints=[UniqueConstraint(columnNames=["book", "chapter_number"])])
class Chapter(@ManyToOne var book:Book,
              @Column var chapterNumber:Int)

13

Way1:

@Entity

@Table(name = "table_name", uniqueConstraints={@UniqueConstraint(columnNames = "column1"),@UniqueConstraint(columnNames = "column2")})

- Здесь и Column1, и Column2 действуют как уникальные ограничения по отдельности. Пример: если в любое время значение столбца1 или столбца2 совпадает, вы получите ошибку UNIQUE_CONSTRAINT.

Way2:

@Entity

@Table(name = "table_name", uniqueConstraints={@UniqueConstraint(columnNames ={"column1","column2"})})

- Здесь объединенные значения column1 и column2 действуют как уникальные ограничения


4
   @Entity @Table(name = "stock", catalog = "mkyongdb",
   uniqueConstraints = @UniqueConstraint(columnNames =
   "STOCK_NAME"),@UniqueConstraint(columnNames = "STOCK_CODE") }) public
   class Stock implements java.io.Serializable {

   }

Ограничения уникальности используются только для создания составного ключа, который будет уникальным. Он будет представлять таблицу как первичный ключ в сочетании с уникальным.


3

Вы можете использовать @UniqueConstraint на уровне класса для комбинированного первичного ключа в таблице. например:

 @Entity
 @Table(name = "PRODUCT_ATTRIBUTE", uniqueConstraints = {
       @UniqueConstraint(columnNames = {"PRODUCT_ID"}) })

открытый класс ProductAttribute {}


1

Уникальная аннотация должна быть размещена прямо над объявлением атрибута. UniqueContraints входят в аннотацию @Table над объявлением класса данных. Увидеть ниже:

@Entity
@Table(uniqueConstraints= arrayOf(UniqueConstraint(columnNames = arrayOf("col_1", "col_2"))))
data class Action(
        @Id @GeneratedValue @Column(unique = true)
        val id: Long?,
        val col_1: Long?,
        val col_2: Long?,
)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.