web-dev-qa-db-ja.com

Hibernate:インデックスの作成

DBに複数のインデックスを作成したい。残念ながら、永続性プロバイダーをEclipseLinkからHibernateに変更する必要がありますが、javax.persistence.Indexを使用したソリューションもHibernateを使用したソリューションも機能しません。

クラスは次のようになります。

@Entity
@Table(name = "my_shop")
public class Shop extends BaseEntity {

    @Temporal(TemporalType.TIMESTAMP)
    @Column(nullable = false)
    private Calendar lastUpdate;
}

これはjavax.persistence。*を使用したソリューションである必要があります。

import javax.persistence.Index;
import javax.persistence.Table;

@Table(name = "my_shop",
        indexes = @Index(columnList = "lastupdate")
)

Hibernateアノテーションは非推奨です。したがって、これらのアノテーションを使用しない理由がなければなりません。

import org.hibernate.annotations.Index; // deprecated
import org.hibernate.annotations.Table;

@Table(...,
        indexes = @Index(columnNames = "lastupdate")
)

Glassfish 3.1.2.2、PostgreSQL 9.1、JPA 2.1、およびhibernate-core 4.3.4.Finalを使用します。データベースを調べると、psql "\ d +"を介して特定のフィールドにインデックスが作成されていません。

これは私のpersistence.xmlがどのように見えるか:

...
    <property name="hibernate.hbm2ddl.auto" value="create"/>
    <property name="dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
...

EclipseLinkのみがこれを簡単に処理できます。

import org.Eclipse.persistence.annotations.Index;

@Entity
@Table(name = "my_shop")
public class Shop extends BaseEntity {

    @Index
    @Temporal(TemporalType.TIMESTAMP)
    @Column(nullable = false)
    private Calendar lastUpdate;
}

@Columnおよび@Indexの「lastupdate」、「lastUpdate」、および追加の「name」属性のすべての組み合わせを使用して、指定されたソリューションをテストしましたが、何も機能しないようです。

更新1

実際、このソリューションは機能します。

@javax.persistence.Table(name = "my_shop")
@Table(appliesTo = "my_shop"
        ,indexes = {@Index(columnNames = "name", name = "name"),
                @Index(columnNames = "lastupdate", name = "lastupdate")}
)

それでも org.hibernate.annotations.Index;は非推奨としてマークされます。それを使用するのは良い習慣ですか?そうでない場合は、代替手段はどうですかjavax.persistence.Indexは機能しません。

org.hibernate.annotations.Index;はすべての値で機能します:create、update、... javax.persistence.Index「hibernate.hbm2ddl.auto」がどの値を持っているかは問題ではなく、機能しません。

17
Rooky

Hibernate 4.3およびPostgreSQL 9.3でJPA 2.1を使用しています。インデックスに問題はありません

hibernate-commons-annotations-4.0.4.Final.jar
hibernate-core-4.3.1.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
jandex-1.1.0.Final.jar
javassist-3.18.1-GA.jar
jboss-transaction-api_1.2_spec-1.0.0.Final.jar

私の設定は

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

それが私のエンティティマッピングです

import javax.persistence.Entity;
import javax.persistence.Index;
import javax.persistence.Table;

@Entity
@Table(name = "users", indexes = {
        @Index(columnList = "id", name = "user_id_hidx"),
        @Index(columnList = "current_city", name = "cbplayer_current_city_hidx")
})

PS。実際、私はその注釈に関していくつかの問題を抱えています。インデックスにテーブルスペースを指定できず、SINGLE_TABLE階層の親クラスのサブクラスにインデックスを作成する必要があります。

30
danbst

Hibernateでは、@Indexアノテーションにname属性を入力する必要があります。

import Java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Index;
import javax.persistence.Table;

@Entity
@Table(
        indexes = {
            @Index(columnList = "description", name = "product_description")
        })
public class Product implements Serializable {
     // ...

     private String description;

     // getters and setters
}

EclipseLinkは必須ではないため、nameが自動的に作成されます。

@Indexアノテーションはhibernate.hbm2ddl.auto=create-dropでのみ機能します。これを参照してください Hibernateフォーラムのエントリ

注意点の1つは、このオプションではテーブルが削除されることですが、一般的にhibernate.hbm2ddl.autoは開発のみを目的としています。

4

総括する:

2
naXa
  • JAVAX

JPA、JERSEY、またはJerseyを使用したSpring Bootのためにすでに含まれているJAVAXパッケージ

 @Table(name = "userDetails",indexes{@Index(columnList="uid,name",name="Index_user")})

利点 :

  • 依存関係を追加する必要はありません
  • @Table内で一意のキーを定義することもできます
  • Hibernate @Indexでも同じことができますが、そのためには、Hibernate依存関係を追加する必要があります。
0
Tapan