Anotação @UniqueConstraint em Java

168

Eu tenho um Java bean. Agora, quero ter certeza de que o campo deve ser exclusivo.

Estou usando o seguinte código:

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

Mas estou recebendo algum erro:

@UniqueConstraint is dissallowed for this location

Qual é a maneira correta de usar restrições exclusivas?

Nota: Estou usando o framework de reprodução.

xyz
fonte
15
"Mas estou recebendo algum erro." Sempre especifique qual erro você está recebendo na pergunta. Você tem informações relevantes que podem muito bem nos ajudar a resolver seu problema - não guarde para si.
precisa
Seria possível usar a anotação @id?
Albinoswordfish

Respostas:

414

Para garantir que um valor de campo seja exclusivo, você pode escrever

@Column(unique=true)
String username;

A anotação @UniqueConstraint é para anotar várias chaves exclusivas no nível da tabela, e é por isso que você recebe um erro ao aplicá-lo a um campo.

Referências (JPA TopLink):

mdma
fonte
17
É importante notar que ele só irá funcionar se você deixar JPA criar suas tabelas
naoru
118

Você pode usar no nível da classe com a seguinte sintaxe

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

Atualmente, estou usando o framework play também com as anotações hibernate e JPA 2.0 e esse modelo funciona sem problemas

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

}

Espero que tenha ajudado.

FrancescoM
fonte
20

Nota: No Kotlin, a sintaxe para declarar as matrizes nas anotações usa em arrayOf(...)vez de{...}

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

Nota: A partir do Kotlin 1.2, é possível usar a [...]sintaxe para que o código se torne muito mais simples

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

Caminho1:

@Entity

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

- Aqui, a Coluna1 e a Coluna2 atuam como restrições exclusivas separadamente. Ex: se a qualquer momento o valor da coluna1 ou da coluna2 corresponder, você receberá o erro UNIQUE_CONSTRAINT.

Way2:

@Entity

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

- Aqui, os valores combinados da coluna1 e da coluna2 atuam como restrições únicas

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

   }

Restrições exclusivas usadas apenas para criar chave composta, que será única. Representará a tabela como chave primária combinada como única.

CodamRanjan
fonte
3

você pode usar @UniqueConstraint no nível da classe, para a chave primária combinada em uma tabela. por exemplo:

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

classe pública ProductAttribute {}

hashem yousefi
fonte
1

A anotação exclusiva deve ser colocada logo acima da declaração do atributo. UniqueContraints entra na anotação @Table acima da declaração da classe de dados. Ver abaixo:

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