Hibernate提供了一种通过Table定义多列索引的机制。有没有办法通过JPA或JPA2指定这是一个ORM不可知的方式(例如使用javax.persistence。* API)
答案 0 :(得分:5)
使用Hibernate 4.3.8与JPA 2.1集成时出现了同样的问题。 看来,mjaggard的回答是正确的。但是,给定的用法示例如下所示:
@Index(name="EMP_NAME_INDEX", columnList={"F_NAME", "L_NAME"})
我不知道这是否有效。我知道在我使用JPA 2.1的情况下,columnList
的值不是数组而是字符串。所以对我来说,可以通过以下方式定义所需的双列索引:
@Index(name="EMP_NAME_INDEX", columnList="F_NAME,L_NAME")
也就是说,只需使用逗号分隔单个字符串中的列名。这对我使用Postgres DBMS很有用。我检查了一下,并在两个列上成功创建了索引。
答案 1 :(得分:2)
不,正如my answer向previous question暗示的那样,没有标准化的方式,您必须使用提供商扩展(当它们存在时)。
答案 2 :(得分:2)
是的,可以使用JPA 2.1,如规范中所示:
http://download.oracle.com/otndocs/jcp/persistence-2_1-pfd-spec/index.html
第445页的表明
索引注释用于模式生成
columnList(必需)要包含在索引中的列的名称。
这里可以看到一个使用示例:
http://java-persistence-performance.blogspot.co.uk/2013/03/but-what-if-im-not-querying-by-id.html
答案 3 :(得分:2)
可以在JPA 2.1中声明多列索引。以下是演示多列索引的示例Entity
类。
@Entity
@Table(uniqueConstraints=@UniqueConstraint(columnNames={"product_id","store_id"}))
class MyEntity {
@Column(name="product_id")
private String productId;
@Column(name="store_id")
private Long storeId;
}
请注意,columnNames
必须是数据库中列的名称,而不是属性名称。