休眠:创建索引

Roo*_*oky 17 java postgresql hibernate 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;
}
Run Code Online (Sandbox Code Playgroud)

这应该是javax.persistence的解决方案.*:

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

@Table(name = "my_shop",
        indexes = @Index(columnList = "lastupdate")
)
Run Code Online (Sandbox Code Playgroud)

不推荐使用Hibernate注释,因此必须有理由不使用这些注释:

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

@Table(...,
        indexes = @Index(columnNames = "lastupdate")
)
Run Code Online (Sandbox Code Playgroud)

我使用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"/>
...
Run Code Online (Sandbox Code Playgroud)

只有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;
}
Run Code Online (Sandbox Code Playgroud)

我在@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")}
)
Run Code Online (Sandbox Code Playgroud)

但仍被org.hibernate.annotations.Index;标记为已弃用.那么使用它是否是好的做法?如果不是什么是替代品,因为显然javax.persistence.Index不起作用.

org.hibernate.annotations.Index;适用于每一个值:创建,更新,... javax.persistence.Index无关紧要"hibernate.hbm2ddl.auto"具有哪些值,不起作用.

dan*_*bst 31

我使用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
Run Code Online (Sandbox Code Playgroud)

虽然我的配置有

<property name="hibernate.hbm2ddl.auto" value="update"/>
Run Code Online (Sandbox Code Playgroud)

那是我的实体映射

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")
})
Run Code Online (Sandbox Code Playgroud)

PS.事实上,我对这些注释有一些问题.我不能为索引指定表空间,并且必须为SINGLE_TABLE层次结构的父类中的子类创建indecies.


Dou*_*ior 7

随着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
}
Run Code Online (Sandbox Code Playgroud)

随着EclipseLink不是必需的,它创建的name自动.


Ang*_*ity 5

@Index注释仅适用于hibernate.hbm2ddl.auto=create-drop,请参阅Hibernate 论坛中的此条目

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


小智 5

  • JAVAX

JAVAX 包已经包含在内,因为 JPA 或 JERSEY 或 Spring Boot 使用 Jersey,所以我们应该使用

 @Table(name = "userDetails", indexes={@Index(columnList="uid,name",name="Index_user")})
Run Code Online (Sandbox Code Playgroud)

好处 :

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