为什么我不能在jpa中定义名为“index”的列?

时间:2013-08-20 02:30:19

标签: mysql hibernate jpa

我使用jpa将对象持久化到mysql数据库。

当我定义一个名为“index”的列时,如下所示,该表将不会在数据库中生成。

当我删除它或重命名它时,jpa工作正常。

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import play.db.jpa.GenericModel;

@Entity
@Table(name="QA_ASSETVM")
public class QAAssetVM extends GenericModel{

     private static final long serialVersionUID = 1L;

     @Id 
     @Column(name="vmassetname")
     public String vmassetname;

     @Column(name="assetvm_index")  //this works fine!
     public int index;
     /*
     @Column(name="index")  //When I add this, the table "QA_ASSETVM" will not be generated by jpa in database.
     public int index;
     */
}

3 个答案:

答案 0 :(得分:3)

正如Hannibal所指出的,index是MySQL中的保留关键字,因此您不能直接将其用作列名,但您必须将其转义。

  1. 如果您使用的是Hibernate 3.5+,请尝试使用hibernate.globally_quoted_identifiers=true,它将引用所有数据库标识符(来源:Automatic reserved word escaping for Hibernate tables and columns
  2. 在JPA 2.0中,您可以使用注释:@Column(name="\"index\""),这是一种新的标准化方法来转义单个列

答案 1 :(得分:2)

我没有尝试使用mysql,但'index'似乎是一个保留字。

检查this

答案 2 :(得分:1)

因为索引是保留字。为了使用索引作为列名,您必须使用在[]中写入它。像这样:

@Column(name="[index]")