@UniqueConstraint anotación en Java

168

Tengo un bean Java. Ahora, quiero asegurarme de que el campo sea único.

Estoy usando el siguiente código:

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

Pero recibo un error:

@UniqueConstraint is dissallowed for this location

¿Cuál es la forma correcta de usar restricciones únicas?

Nota: estoy usando play framework.

xyz
fuente
15
"Pero estoy obteniendo algún error". Siempre especifique qué error obtiene en la pregunta. Tiene información relevante que puede ayudarnos a resolver su problema; no se la guarde.
Jon Skeet
¿Sería posible usar la anotación @id?
Albinoswordfish

Respuestas:

414

Para asegurarse de que un valor de campo sea único, puede escribir

@Column(unique=true)
String username;

La anotación @UniqueConstraint es para anotar múltiples claves únicas en el nivel de tabla, por lo que obtiene un error al aplicarlo a un campo.

Referencias (JPA TopLink):

mdma
fuente
17
Es importante tener en cuenta que solo funcionará si deja que JPA cree sus tablas
naoru
118

Puede usar a nivel de clase con la siguiente sintaxis

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

Actualmente estoy usando play framework también con hibernación y anotación JPA 2.0 y este modelo funciona sin 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 haya ayudado.

FrancescoM
fuente
20

Nota: en Kotlin, la sintaxis para declarar las matrices en anotaciones se usa en arrayOf(...)lugar de{...}

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

Nota: A partir de Kotlin 1.2, es posible usar la [...]sintaxis para que el código sea mucho más simple

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

Way1:

@Entity

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

- Aquí, tanto Column1 como Column2 actúan como restricciones únicas por separado. Por ejemplo: si en algún momento el valor de la columna1 o la columna2 coincide, obtendrá un error UNIQUE_CONSTRAINT.

Way2:

@Entity

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

- Aquí, los valores combinados de column1 y column2 actúan como restricciones únicas

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

   }

Restricciones únicas utilizadas solo para crear claves compuestas, que serán únicas. Representará la tabla como clave primaria combinada como única.

CodamRanjan
fuente
3

puede usar @UniqueConstraint en el nivel de clase, para la clave primaria combinada en una tabla. por ejemplo:

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

ProductAttribute de clase pública {}

Hashem Yousefi
fuente
1

La anotación única debe colocarse justo encima de la declaración de atributo. UniqueContraints entra en la anotación @Table encima de la declaración de clase de datos. Vea abajo:

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