是否有注释在jpa2中定义多列索引

时间:2010-09-20 09:51:11

标签: hibernate orm jpa jpa-2.0

Hibernate提供了一种通过Table定义多列索引的机制。有没有办法通过JPA或JPA2指定这是一个ORM不可知的方式(例如使用javax.persistence。* API)

4 个答案:

答案 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 answerprevious 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必须是数据库中列的名称,而不是属性名称。