Adnotacja @UniqueConstraint w Javie

168

Mam fasolę Java. Teraz chcę mieć pewność, że pole powinno być niepowtarzalne.

Używam następującego kodu:

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

Ale pojawia się błąd:

@UniqueConstraint is dissallowed for this location

Jaki jest właściwy sposób używania unikalnych ograniczeń?

Uwaga: używam platformy do zabawy.

xyz
źródło
15
„Ale pojawia się jakiś błąd”. Zawsze określaj, jaki błąd otrzymujesz w pytaniu. Masz istotne informacje, które mogą nam bardzo pomóc rozwiązać Twój problem - nie zatrzymuj ich dla siebie.
Jon Skeet
Czy byłoby możliwe użycie adnotacji @id?
Albinoswordfish

Odpowiedzi:

413

Aby upewnić się, że wartość pola jest niepowtarzalna, możesz pisać

@Column(unique=true)
String username;

Adnotacja @UniqueConstraint służy do opisywania wielu unikalnych kluczy na poziomie tabeli, dlatego podczas stosowania jej do pola pojawia się błąd.

Referencje (JPA TopLink):

mdma
źródło
16
Ważne jest, aby pamiętać, że zadziała tylko wtedy, gdy pozwolisz JPA utworzyć swoje tabele
naoru
118

Możesz używać na poziomie klasy z następującą składnią

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"username"})})
public class SomeEntity {
    @Column(name = "username")
    public String username;
}
Divanshu
źródło
41

Obecnie używam również frameworka odtwarzania z hibernacją i adnotacjami JPA 2.0, a ten model działa bez problemów

@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;

}

Mam nadzieję, że to pomogło.

FrancescoM
źródło
20

Uwaga: w Kotlinie składnia deklarowania tablic w adnotacjach używa arrayOf(...)zamiast{...}

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

Uwaga: od wersji Kotlin 1.2 możliwe jest użycie [...]składni, dzięki czemu kod stał się znacznie prostszy

@Entity
@Table(uniqueConstraints=[UniqueConstraint(columnNames=["book", "chapter_number"])])
class Chapter(@ManyToOne var book:Book,
              @Column var chapterNumber:Int)
GlenPeterson
źródło
13

Way1:

@Entity

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

- Tutaj zarówno Kolumna1, jak i Kolumna2 działają oddzielnie jako unikalne ograniczenia. Np .: jeśli kiedykolwiek dopasuje się wartość kolumny1 lub kolumny2, pojawi się błąd UNIQUE_CONSTRAINT.

Way2:

@Entity

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

- W tym przypadku połączone wartości kolumna1 i kolumna2 działają jak unikalne ograniczenia

Manjunath HM
źródło
4
   @Entity @Table(name = "stock", catalog = "mkyongdb",
   uniqueConstraints = @UniqueConstraint(columnNames =
   "STOCK_NAME"),@UniqueConstraint(columnNames = "STOCK_CODE") }) public
   class Stock implements java.io.Serializable {

   }

Unikalne ograniczenia używane tylko do tworzenia klucza złożonego, który będzie unikalny i będzie reprezentował tabelę jako klucz podstawowy połączony jako unikalny.

CodamRanjan
źródło
3

możesz użyć @UniqueConstraint na poziomie klasy, dla połączonego klucza podstawowego w tabeli. na przykład:

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

publiczna klasa ProductAttribute {}

hashem yousefi
źródło
1

Unikalną adnotację należy umieścić tuż nad deklaracją atrybutu. UniqueContraints trafiają do adnotacji @Table powyżej deklaracji klasy danych. Zobacz poniżej:

@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?,
)
R Lu
źródło