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」がどの値を持っているかは問題ではなく、機能しません。
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階層の親クラスのサブクラスにインデックスを作成する必要があります。
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
は開発のみを目的としています。
総括する:
javax.persistence.Index
( JSR-000338 、p。450、アイテム11.1.23を参照)org.hibernate.annotations.Index
JPA、JERSEY、またはJerseyを使用したSpring Bootのためにすでに含まれているJAVAXパッケージ
@Table(name = "userDetails",indexes{@Index(columnList="uid,name",name="Index_user")})
利点 :