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


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):


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

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.


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)

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


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.


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 {}


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?,
)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.