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