2010-12-28 17 views
23

¿Cómo puedo implementar mis limitaciones únicas en los POJO hibernadores? asumiendo que la base de datos no contiene ninguna.Utilizando una restricción única en Hibernate JPA2

He visto el atributo único en la anotación @Column() pero no pude hacerlo funcionar?
¿Qué ocurre si deseo aplicar esta restricción a más de una columna?

+0

es 'C' en' @ Column' y no 'c' !!! – KNU

Respuesta

32

Bascially, no se puede aplicar restricción única sin el apoyo de base de datos.

@UniqueConstraint y unique atributo de @Column son instrucciones para que la herramienta de generación de esquema genere las restricciones correspondientes, no implementan las restricciones en sí.

Puede hacer algún tipo de comprobación manual antes de insertar nuevas entidades, pero en este caso debe tener en cuenta los posibles problemas con las transacciones simultáneas.

Por lo tanto, aplicar restricciones en la base de datos es la opción preferida.

+1

¿Entonces la aplicación no aplicará restricciones únicas a menos que el db lo agregue explícitamente? Supongo que ddl está desactivado –

43

puede declarar restricciones únicas utilizando la anotación @Table(uniqueConstraints = ...) en su clase

@Entity 
@Table(uniqueConstraints= 
      @UniqueConstraint(columnNames = {"surname", "name"})) 
public class SomeEntity { 
    ... 
} 
+0

Intenté usarlo pero eclipse incapaz de identificar esta anotación –

+0

¿Cuál? ¿El @UniqueConstraint? Ese viene de javax.persistence.UniqueConstraint – Hons

+1

He agregado una restricción en la tabla pero no funciona –

19

En JPA2, se puede añadir la restricción único directamente al campo:

@Entity 
@Table(name="PERSON_TABLE") 
public class Person{ 
    @Id 
    @Column(name = "UUID") 
    private String id; 

    @Column(name = "SOCIALSECURITY", unique=true) 
    private String socialSecurityNumber; 

    @Column(name = "LOGINID", unique=true) 
    private String loginId; 
} 

mi humilde opinión es mucho mejor para asignar la restricción única directamente a los atributos que en el beggining de la tabla.

Sin embargo, si necesita declarar una clave única compuesta, entonces declararla en la anotación @table es su única opción.

+0

¿Es esto un contraint único para una sola columna o es esto un contraint único a la combinación de socialSecurityNumber y loginId? –

+13

@StephanSchielke Esto crea una restricción única separada para cada columna. Para crear una restricción única en múltiples campos, debe usar el enfoque de Hons. – Naliba

Cuestiones relacionadas