2009-06-03 16 views
20

Tengo dos campos de una clase de entidad que no quiero que sean exclusivos, sino que se utilicen como campos compuestos para una clave que debe ser única. Por ejemplo, tengo dos campos (nombre y versión) que pueden ser iguales para otros registros, pero juntos deben ser únicos. ¿Cuál es la mejor manera de hacerlo usando Hibernate (con anotaciones)? Estoy usando Hibernate Validator para otros campos, pero no estoy seguro de cómo usar eso para validar que dos campos juntos componen una clave única. Estoy usando una clase de entidad genérica que tiene un tipo genérico de Id. Que se puede intercambiar para una clase de clave compuesta, pero todavía tengo que conseguir que funcione muy bien.¿Cómo obtener una clave única para dos campos con Hibernate?

+0

¿Desea una "restricción única" en dos columnas, o una "clave principal" en la tabla que consta de dos columnas? –

+0

Quiero una restricción única en dos columnas. Por ejemplo, la combinación de nombre y versión debe ser única. Así que podría tener dos registros en la tabla con el registro # 1 (name = abc/version = 1) y con el registro # 2 (name = abc/version = 2), pero no dos registros en la tabla con el registro # 1 (nombre = abc/version = 1) y con el registro # 2 (name = abc/version = 1). –

Respuesta

37

Esto creará una clave única en la base de datos:

@Table(name = "MYTABLE", 
     uniqueConstraints = { @UniqueConstraint(columnNames = { "NAME", "VERSION" }) }) 

Esto se hará cumplir por la base de datos en una actualización o persisten.

Tendrá que escribir su propio validador personalizado si desea hacer cumplir esto usando Hibernate Validator.

+0

y lo que debe escribirse en la entidad como pk? ... si el pk es nombre y versión –

+1

@yoav.str - Si PK es el nombre y la versión, en su lugar debe usar una clave primaria compuesta con @ Id/@ IdClass o @ EmbeddedId/@ Embeddable – mtpettyp

+0

Esto funcionó para mí usando Hibernate 3.6.3.Final. ¡Gracias! – Jorge

4

Normalmente ajustamos los dos campos en una clase de clave interna que está marcada como @Embeddable. Por ejemplo:

@Entity 
public class Foo { 

    @EmbeddedId() 
    private Key key; 
    ... 

    @Embeddable 
    public static class Key { 
    @Column(nullable=false) 
    private String name; 
    @Column(nullable=false) 
    private int version; 

    protected Key() { 
     // for hibernate 
    } 
    public Key (String name, int version) { 
     this.name = name; 
     this.version = version; 
    } 
    ... 
    // You probably want .equals and .hashcode methods 
    } 
} 
Cuestiones relacionadas