@UniqueConstraint анотація на Java


168

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

Я використовую такий код:

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

Але я отримую деяку помилку:

@UniqueConstraint is dissallowed for this location

Який правильний спосіб використовувати унікальні обмеження?

Примітка: я використовую програму play.


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

В даний час я також використовую ігрові рамки зі сплячим режимом та анотацією 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

Шлях1:

@Entity

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

- Тут і Column1, і Column2 виступають як унікальні обмеження окремо. Наприклад: якщо будь-яке значення значення столбца1 або стовпця2 відповідає, ви отримаєте помилку UNIQUE_CONSTRAINT.

Шлях2:

@Entity

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

- Тут і колонка1, і колонка2 об'єднані значення виступають як унікальні обмеження


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.