休眠:创建索引

2022-09-01 16:49:53

我想在我的数据库中创建多个索引。不幸的是,我们必须将持久性提供程序从EclipseLink更改为Hibernate,但是使用javax.persistence.Index的解决方案也不起作用。

这是该类的样子:

@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")
)

休眠注释已弃用,因此必须有理由不使用这些注释:

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+” 在特定字段上创建索引。

这是我的坚持.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;与每个价值一起工作:创建,更新,... 不管“hibernate.hbm2ddl.auto”具有哪个值,都不起作用。javax.persistence.Index


答案 1

我将 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层次结构。


答案 2

您需要在注释中输入属性。Hibernatename@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
}

with 不是必需的,它会自动创建。EclipseLinkname


推荐