休眠:创建索引

时间:2014-04-02 15:53:33

标签: java hibernate postgresql jpa

我想在我的数据库中创建几个索引。不幸的是,我们必须将持久性提供程序从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;
}

我用所有组合测试了给定的解决方案&#34; lastupdate&#34;,&#34; lastUpdate&#34;和另外的名字&#34; @Column和@Index中的属性,但似乎没有任何效果。

希望有人可以帮助我, 干杯!

更新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;适用于所有值:创建,更新,... javax.persistence.Index并不重要&#34; hibernate.hbm2ddl.auto&#34;有,不工作。

5 个答案:

答案 0 :(得分:30)

我将JPA 2.1与Hibernate 4.3和PostgreSQL 9.3一起使用。我没有索引问题

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层次结构的父类中的子类创建indecies。

答案 1 :(得分:6)

使用Hibernate,您需要在name注释中输入@Index属性。

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

答案 2 :(得分:4)

@Index注释仅适用于hibernate.hbm2ddl.auto=create-drop,请参阅此entry in the Hibernate forums

只有一点需要注意的是,此选项会删除表格,但通常hibernate.hbm2ddl.auto仅用于开发目的。

答案 3 :(得分:2)

总结一下:

答案 4 :(得分:0)

  • JAVAX

由于JPA或JERSEY或使用Jersey的Spring Boot,已经包含了JAVAX软件包,因此我们应该选择

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

好处:

  • 我们不需要添加任何额外的依赖关系
  • 我们还可以在@Table中定义唯一键
  • 休眠 我们可以使用@Index做同样的事情,但是为此,我们需要添加Hibernate依赖项。