views:

414

answers:

3

Morning.

I need to add indexing in hibernate entity. As I know it is possible to do using @Index annotation to specify index for separate column but I need an index for several fields of entity.

I've googled and found jboss annotation @Table, that allows to do this (by specification). But (I don't know why) this functionality doesn't work. May be jboss version is lower than necessary, or maybe I don't understant how to use this annotation, but... complex index is not created.

Why index may not be created?

jboss version 4.2.3.GA

Entity example:

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;
    }
}

When jboss/hibernate tries to create table "house" it throws following exception:

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

You'd better go with a composite primary key.

This article explains how to do it with JPA annotations. It uses @Embeddable and @EmbeddedId

Bozho
Thank you. Use JPA specific API is right thing but ... it's still not clear why it doesn't work on jboss. I've tried to use the same class specifying @Index annotation for separate fields but it doesn't work too.
foobar
Did you read the article? Use `Embeddable` and `EmbeddedId`.
Bozho
It's not necessary to make entity embeddable in my business logic. There must be more simplest decision. But don't know yet how to do it ....Yes, I've read that article.
foobar
this is the simplest and best solution. Since your primary key is composite, you better abstract it a a new object.
Bozho
Bozho, I totally agree with U, but I want to do less redesign of business domain classes (entities), because it's already used by the application.
foobar
Anyway thanks for sharing you knowledge. I'll note this approach for the future.
foobar
+2  A: 

Please try the following:

@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 {
    ...
}

Note that this should also allow you to create a multi-column index (based on the index name):

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

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

P.S.: What version of Hibernate are you using BTW? What database/dialect?

Pascal Thivent
A: 

You have to have hibernate.hbm2ddl.auto set to create in persistence.xml. When set to update hibernate won't create indexes.

hibernate.hbm2ddl.auto = create

fraktalek
I've tried to do like you sad, but indexes were not created
foobar
may be it was because of jboss version
foobar