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
?
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).
Posible duplicado de ¿Cómo introducir restricciones de varias columnas con anotaciones JPA?
– Devendra Bhatte
25 de enero de 2017 a las 13:58