2010-05-05 23 views
51

estoy tratando de introducir una restricción multitecla en una entidad asignada al JPA:¿Cómo introducir restricciones de múltiples columnas con anotaciones JPA?

public class InventoryItem { 
    @Id 
    private Long id; 

    @Version 
    private Long version; 

    @ManyToOne 
    @JoinColumn("productId") 
    private Product product; 

    @Column(nullable=false); 
    private long serial; 
} 

Básicamente (producto, serie) par debe ser único, pero sólo encontró una manera de decir que de serie debe ser único . Obviamente, esto no es una buena idea ya que diferentes productos pueden tener los mismos números de serie.

¿Hay alguna manera de generar esta restricción a través de JPA o me veo obligado a crearla manualmente en la base de datos?

Respuesta

110

Se puede declarar restricciones únicas utilizando la anotación @Table(uniqueConstraints = ...) en su clase de entidad, es decir

@Entity 
@Table(uniqueConstraints={ 
    @UniqueConstraint(columnNames = {"productId", "serial"}) 
}) 
public class InventoryItem { 
    ... 
} 

Tenga en cuenta que esto no crea mágicamente la restricción única en la base de datos, usted todavía necesita un DDL para que pueda ser creado . Pero parece que está utilizando algún tipo de herramienta automatizada para crear la base de datos basada en definiciones de entidades JPA.

+0

Es este tipo de cosas necesita para una base de datos existente con las limitaciones que ya existen? – Rob

33

Como ya se ha respondido, se puede agregar el índice de varias columnas mediante la anotación @Table. Sin embargo, columnNames debe ser el nombre de las columnas DB reales, no el atributo de clase. Por lo tanto, si la columna es como la siguiente:

@Column(name="product_id") 
Long productId; 

Entonces el @Table anotación debe ser como la siguiente

@Table(uniqueConstraints= 
     @UniqueConstraint(columnNames = {"product_id", "serial"}) 
+3

Esta es una aclaración muy importante: nombres de tablas y no nombres de objetos. – Calabacin

Cuestiones relacionadas