【问题标题】:Why I cannot define an column named "index" in jpa?为什么我不能在 jpa 中定义一个名为“index”的列?
【发布时间】:2013-08-20 02:30:18
【问题描述】:

我使用 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;
     */
}

【问题讨论】:

  • 这里不能测试,但是能不能声明两次public int index?
  • index 等关键字不能用作列名..
  • 显然,如果它们被引用,它们就可以使用,而这正是其他一些 JPA 实现(例如 DataNucleus JPA)为用户所做的......

标签: mysql hibernate jpa


【解决方案1】:

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

@Column(name="[index]")

【讨论】:

    【解决方案2】:

    正如 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\""),这是转义单个列的新标准化方法

    【讨论】:

      【解决方案3】:

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

      检查this

      【讨论】:

        猜你喜欢
        • 2016-07-09
        • 2010-09-26
        • 1970-01-01
        • 2011-03-08
        • 2017-01-11
        • 2023-04-11
        • 2015-07-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多