# Hibernate @Index



## Guest (21. Jul 2008)

Hallo,

ich veruche meiner Tabelle über die @Index Annotation einen Indize zu zuweisen:


```
@Column(name = "col1")
@Index(name = "idx_col1")
public int getCol1()
{
    return col1;
}
```

Meine Hibernate Config ist auf <property name="hibernate.hbm2ddl.auto">update</property> gestellt und die Tabelle die den Index bekommen soll habe ich gelöscht das Sie auch problemlos von Hibernate angelegt werden kann ...

Wenn ich mein Programm nun starte, legt er mir zwar die Tabelle an, ignoriert aber die @Index Annotation.
Habe auch schon versucht ihm die Indexe in der @Table Annotation unterzujubeln - ignoriert er allerdings ebenfalls.

Weiss jemand Rat wie ich meiner Tabelle per hibernate Indizes zuweisen kann?


----------



## klarkimming (8. Dez 2008)

Hallo,

der Thread ist zwar etwas alt aber ich habe momentan das selbe Problem....

Umgebung:

Java 1.6
Hibernate 3.2.4
Postgres 8.3.3


```
@Entity
//@org.hibernate.annotations.Table(appliesTo="TestIndex", indexes = { @Index(name="testspaltemain", columnNames={"testspalte"} ) } )
public class TestIndex {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "primaryKeySequence")
    @SequenceGenerator(name = "primaryKeySequence", sequenceName = "primaryKey_SEQ", allocationSize = 100)
    @Column(name = "UserPersistence_PK", insertable = false, updatable = false)
    private long _primaryKey;

    @Column(name = "InsertDate")
    @Temporal(value = TemporalType.TIMESTAMP)
    private Date _InsertDate;

    @Column(name = "UpdateDate")
    @Temporal(value = TemporalType.TIMESTAMP)
    private Date _UpdateDate;

    @Column(name = "Version")
    @Version
    private Integer _Version = 1;

    @PrePersist
    private void __jpaPrePersist() {
        _InsertDate = new Date();
        _UpdateDate = new Date();
    }

    @PreUpdate
    private void __jpaPreUpdate() {
        _UpdateDate = new Date();
    }

    @Column(name ="testspalte")
    @Index(name = "TESTHIBERNATE")
    private String _testSpalte;

}
```


```
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/test.spring.xml"})
public class TestUnit {

    @PersistenceContext
    private EntityManager _entityManager;

    @Test
    @Transactional
    @Rollback(value = false)
    public void test() {
        Assert.assertTrue(true);
        TestIndex test = new TestIndex();
        _entityManager.persist(test);
    }
}
```


```
<?xml version="1.0" encoding="UTF-8" ?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
   <persistence-unit name="businessplan">
        <description>
        </description>
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
</persistence>
```


Das Ergebnis ist, dass die Tabelle korrekt erstellt wurde. Aber der Index nicht vorhanden ist!!!!!

Wo koennte das Problem liegen ?

Hat schon mal jemand mit der "Index" oder "Table" Annotation unter "Benutzung von JPA" einen Index erstellt ? Wenn, ja welche Umgebung ? 

Bin irgendwie am verzweifeln ... (google hiflt auch nicht...)


----------



## GilbertGrape (8. Dez 2008)

Hallo Klarkimming,

ich kann dir leider nicht helfen, aber ich benutze auch Indizes unter Hibernate und bei mir funktioniert das.
Ich benutze Java 1.5, Hibernate 3 und Oracle 11g.
Achso, ich annotiere die Indexspalte dann nicht mehr mit @Index. 
Also dann nur noch so:


```
@Column(name ="testspalte")
        private String _testSpalte;
```

Der Index heißt doch schon testspaltemain.


----------



## klarkimming (8. Dez 2008)

Danke schon mal fuer den Hinweis...

Du meinst also, dass du den Index per "Table" Annotation setzt ? (Hatte beide Varianten ausprobiert, "Table" war im Bsp. auskommentiert).

Nur um ganz sicher zu gehen, dein DB Manager zeigt den Index auch an ? Ich weiss dumme Frage... aber ich habe bereits mit einigen Personen gesprochen, die sagten das funktioniert bei Ihnen und dann kam die boese Ueberaschung....


----------



## GilbertGrape (8. Dez 2008)

Hallo,

ja, ich habe den Index über die Table-Annotation von Hibernate gesetzt. So:

```
@org.hibernate.annotations.Table(appliesTo="UNMODIFIED_TEXT", 
    indexes=@org.hibernate.annotations.Index(name="idx_unmod_text_hash", 
        columnNames={"HASH_VALUE"}))
```

und mir wird der Index dann im SQL-Developer angezeigt:







Ich hab ihn auch wirklich nur per hibernate angelegt  :wink:


----------



## klarkimming (8. Dez 2008)

Danke fuer die Antworten...

Das hat mich motiviert noch tiefer zu suchen und tatsaechlich der "Fehler" ist gefunden...

```
<property name="hibernate.hbm2ddl.auto" value="update"/>
```

Dann wird der Index nicht angelegt.

mit

```
<property name="hibernate.hbm2ddl.auto" value="create"/>
```

wird der Index angelegt.

Selbst wenn die Tabelle nicht existiert wird der Index bei "update" nicht anglegt...

DANKE nochmals fuer die Motivation weiter zu suchen...

[/quote]


----------



## GilbertGrape (9. Dez 2008)

Vielen Dank, dass du die Lösung hier nochmal hingeschrieben hast.
Das wusste ich nicht und vielleicht brauch ich das nochmal!


----------



## murkus H. (3. Mrz 2010)

Weiss zufällig jemand, ob dies mit einer neuen Hibernate Version auch mit dem "update" shema update möglich ist?


----------

