我想在我的数据库中创建几个索引。不幸的是,我们必须将持久性提供程序从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;有,不工作。
答案 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)
总结一下:
javax.persistence.Index
(见JSR-000338,第450页,第11.1.23项)org.hibernate.annotations.Index
答案 4 :(得分:0)
由于JPA或JERSEY或使用Jersey的Spring Boot,已经包含了JAVAX软件包,因此我们应该选择
@Table(name = "userDetails",indexes{@Index(columnList="uid,name",name="Index_user")})
好处: