Creación de restricciones únicas compuestas en varias columnas

2 minutos de lectura

avatar de usuario
destripador234

Este es mi modelo:

class User {...}
class Book {
  User author;
  int number;
}

Cada número de libro comienza en 1 por autor y se incrementa hacia arriba. Así que tendremos los Libros 1,2,3 de John Grisham, el Libro 1…5 de George Martin, etc…

¿Hay una restricción única que pueda colocar en Book, eso garantizaría que no tengamos dos libros con el mismo número del mismo autor? Similar a @Column(unique = true)pero la restricción solo se aplica al compuesto de Author X number?

  • Posible duplicado de ¿Cómo introducir restricciones de varias columnas con anotaciones JPA?

    – Devendra Bhatte

    25 de enero de 2017 a las 13:58

Usar @UniqueConstraint:

@Table(
    uniqueConstraints=
        @UniqueConstraint(columnNames={"author_id", "number"})
)
@Entity
class Book extends Model {
   @ManyToOne
   @JoinColumn(name = "author_id")
   User author;
   int number; 
} 

  • ¿Qué pasa con hacer autor y número @id como FK?

    – Javier Gutiérrez

    10/04/2013 a las 17:35

  • y para múltiples restricciones únicas compuestas, la sintaxis es @Table(uniqueConstraints = {@UniqueConstraint(columnNames = { “field1”, “field2”, “field3” }), @UniqueConstraint(columnNames = {“field4”, “field5”}) }) )

    – Manú

    26 de julio de 2014 a las 9:47


  • Al agregar esta restricción única, hibernate ya no puede crear mi tabla cuando implemento la aplicación. ¿Puedes ayudar a algunos?

    – Adelín

    24 de febrero de 2015 a las 7:38


  • ¿La unicidad es para la columna (productId) y la columna (serie) o para la restricción de 2 columnas en total (productId, serial)?

    – Satish Patro

    21 de agosto de 2019 a las 5:20

Cuando la tabla se crea antes, es necesario eliminarla. La clave única no se agrega a la tabla existente.

Como @axtavt ha respondido, puede usar el @UniqueConstraint Acercarse. Pero en el caso de una mesa existente, hay múltiples posibilidades. No todas las veces, pero en general puede obtener una SQLException. La razón es que puede tener algunos datos existentes en su tabla que están en conflicto con la clave única compuesta. Entonces, todo lo que puede hacer para evitar esto es verificar primero manualmente (mediante una consulta SQL simple) si todos sus datos existentes son buenos para ir con la clave única compuesta. Si no, por supuesto, elimine los datos que causan la violación. (Otra forma es eliminar toda la tabla existente, pero solo se puede usar si no contiene datos importantes).

¿Ha sido útil esta solución?