2010-02-02 19 views
6

Mañana.¿Cómo se define el índice por varias columnas en la entidad de hibernación?

Necesito agregar indexación en la entidad de hibernación. Como sé, es posible hacerlo usando la anotación @Index para especificar el índice para una columna separada, pero necesito un índice para varios campos de entidad.

He buscado en Google y he encontrado la anotación jboss @Table, que permite hacer esto (por especificación). Pero (no sé por qué) esta funcionalidad no funciona. Puede ser la versión de jboss más baja de lo necesario, o tal vez no entiendo cómo usar esta anotación, pero ... no se crea un índice complejo.

¿Por qué no se puede crear el índice?

versión de JBoss 4.2.3.GA

Entidad ejemplo:

package somepackage; 
import org.hibernate.annotations.Index; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 

@Entity 
@org.hibernate.annotations.Table(appliesTo = House.TABLE_NAME, 
    indexes = { 
      @Index(name = "IDX_XDN_DFN", 
        columnNames = {House.XDN, House.DFN} 
      ) 
    } 
) 

public class House { 
    public final static String TABLE_NAME = "house"; 
    public final static String XDN = "xdn"; 
    public final static String DFN = "dfn"; 

    @Id 
    @GeneratedValue 
    private long Id; 

    @Column(name = XDN) 
    private long xdn; 

    @Column(name = DFN) 
    private long dfn; 

    @Column 
    private String address; 

    public long getId() { 
     return Id; 
    } 

    public void setId(long id) { 
     this.Id = id; 
    } 

    public long getXdn() { 
     return xdn; 
    } 

    public void setXdn(long xdn) { 
     this.xdn = xdn; 
    } 

    public long getDfn() { 
     return dfn; 
    } 

    public void setDfn(long dfn) { 
     this.dfn = dfn; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 
} 

Cuando jboss/hibernación intenta crear la "casa" de mesa que arroja siguiente excepción:

Reason: org.hibernate.AnnotationException: @org.hibernate.annotations.Table references an unknown table: house 
+1

por cierto, se supone que para marcar respuestas aceptadas (la garrapata por debajo de los votos), si le conviene. – Bozho

+0

@foobar: ¿resolvió su problema? – Bozho

+0

He deseado crear índices manualmente mediante scripts SQL. Su sugerencia es correcta, pero supongo que es como un truco que los usuarios utilizan como un enfoque de hibernación. Y este método no puede ser elegible para otro proveedor de persistencia. El problema está resuelto, pero en el futuro quiero dedicarle un poco más de tiempo para darme cuenta de cómo hacer esta tarea de la mejor manera. Voy a escribir sobre el resultado aquí ... Muchas gracias. –

Respuesta

-1

Usted' Será mejor ir con una clave primaria compuesta.

This article explica cómo hacerlo con las anotaciones JPA. Utiliza @Embeddable y @EmbeddedId

+0

Gracias. Usar API específica de JPA es lo correcto, pero ... aún no está claro por qué no funciona en jboss. Intenté usar la misma clase especificando la anotación @Index para campos separados pero tampoco funciona. –

+0

¿Has leído el artículo? Use 'Embeddable' y' EmbeddedId'. – Bozho

+0

No es necesario hacer que la entidad se pueda integrar en mi lógica comercial. Debe haber una decisión más simple. Pero aún no sé cómo hacerlo ... Sí, he leído ese artículo. –

14

intenta lo siguiente:

@Entity 
@org.hibernate.annotations.Table(appliesTo = House.TABLE_NAME, 
    indexes = { 
      @Index(name = "IDX_XDN_DFN", 
        columnNames = {House.XDN, House.DFN} 
      ) 
    } 
) 
@Table(name="house") 
public class House { 
    ... 
} 

Tenga en cuenta que esto también debe permitir la creación de un índice de varias columnas (basado en el nombre de índice):

@Index(name = "index1") 
public String getFoo(); 

@Index(name = "index1") 
public String getBar(); 

PD: ¿Qué versión de Hibernate estás utilizando por cierto? ¿Qué base de datos/dialecto?

1

Tienes que tener hibernate.hbm2ddl.auto configurado para crear en persistence.xml. Cuando se configura para actualizar, hibernate no creará índices.

hibernate.hbm2ddl.auto = create

+0

He intentado hacer lo que te parece triste, pero no se crearon índices –

+0

puede ser debido a la versión de jboss –

+0

Parece que no es cierto en general; para mí, los índices se crearon incluso con 'hibernate.hbm2ddl.auto = update'. –

Cuestiones relacionadas