Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 将JPA实体命名为“JPA”是否违法;“组”吗;?_Hibernate_Orm_Jpa_Java Ee 6_Jpa 2.0 - Fatal编程技术网

Hibernate 将JPA实体命名为“JPA”是否违法;“组”吗;?

Hibernate 将JPA实体命名为“JPA”是否违法;“组”吗;?,hibernate,orm,jpa,java-ee-6,jpa-2.0,Hibernate,Orm,Jpa,Java Ee 6,Jpa 2.0,我正在开发一个JEE6应用程序,使用JPA2.0和Hibernate 3.5.2-Final作为提供程序(以及MySQL 5.1.41)。我的应用服务器是Glassfish V3.0.1。 我已经有了一个可以工作的CRUD应用程序,其中包含一些实体和关系 现在,我添加了一个名为“Group”的实体(非常简单)。实体类如下所示: package model //Imports... @Entity public class Group { @Id @GeneratedValue priva

我正在开发一个JEE6应用程序,使用JPA2.0和Hibernate 3.5.2-Final作为提供程序(以及MySQL 5.1.41)。我的应用服务器是Glassfish V3.0.1。 我已经有了一个可以工作的CRUD应用程序,其中包含一些实体和关系

现在,我添加了一个名为“Group”的实体(非常简单)。实体类如下所示:

package model
//Imports...
@Entity
public class Group {
  @Id @GeneratedValue
  private Long id;

  @NotNull
  private String name;

  //Getters and Setters
}
当然,我还将其添加到persistence.xml中,比如
model.Group
。My persistence.xml删除并重新创建部署时的所有表

因此,在部署应用程序时,将生成除表组之外的所有实体的表。在hibernate日志中,我发现了以下错误(这不会阻止部署应用程序)

现在,当我将实体重命名为“MyGroup”(属性保持不变),相应地修改persistence.xml并重新部署我的应用程序时,表“MyGroup”成功创建!我在日志中发现以下几行,显示MyGroup已正确创建:

[#|2010-06-30T11:58:51.456+0200|INFO|glassfish3.0.1|org.hibernate.cfg.AnnotationBinder|_ThreadID=11;_ThreadName=Thread-1;|Binding entity from annotated class: model.MyGroup|#]
[#|2010-06-30T11:58:51.456+0200|INFO|glassfish3.0.1|org.hibernate.cfg.annotations.EntityBinder|_ThreadID=11;_ThreadName=Thread-1;|Bind entity model.MyGroup on table MyGroup|#]
[#|2010-06-30T11:59:21.569+0200|INFO|glassfish3.0.1|org.hibernate.cfg.AnnotationBinder|_ThreadID=25;_ThreadName=Thread-1;|Binding entity from annotated class: model.MyGroup|#]
[#|2010-06-30T11:59:21.569+0200|INFO|glassfish3.0.1|org.hibernate.cfg.annotations.EntityBinder|_ThreadID=25;_ThreadName=Thread-1;|Bind entity model.MyGroup on table MyGroup|#]
有人知道问题出在哪里吗?
好的,我可以把这个组重命名为MyGroup,但我真的想知道这里发生了什么。我现在有什么限制吗,比如“不要调用实体组”?但是如果是这样的话,为什么我不清楚这个错误?

组是数据库MySQL中的保留字,请参见

编辑
如果您想在db实例中使用保留字,请参阅@Pascals answer for JPA 2.0 way。

对于某些JPA实现,您可以使用具有类似名称的类,而JPA实现会做一些合理的事情,并在任何SQL中“引用”名称(因为Paul Whelan指出,它是保留字),因此它被接受。当然允许这样做没有问题。

如果您告诉JPA提供者转义数据库对象名称,则可以使用保留关键字。这已在JPA 2.0中标准化,如本规范下一节所述:

2.13数据库对象的命名 (……)

要指定分隔标识符,请选择一个 必须采用以下方法之一: 使用:

  • 可以指定一个数据库中使用的所有数据库标识符 持久性单位应视为 通过指定
    元素 在
    持久化单元默认值中
    对象/关系xml的元素 映射文件。如果
    元素是 如果已指定,则无法重写它

  • 可以在每个名称的基础上指定 要解释的数据库对象 作为分隔标识符,如下所示:

    • 通过使用注释,名称由指定为分隔标识符 将名称包含在double中 引号,其中内部引号是 逃脱,例如。,
      @Table(name=“\”customer\”)
    • 什么时候 使用XML,将名称指定为 使用双精度分隔的标识符 引号,例如,
因此,JPA 2.0的方法是指定
,如下所示:

@Entity
@Table(name="\"Group\"")
public class Group {
  @Id @GeneratedValue
  private Long id;

  @NotNull
  private String name;

  //Getters and Setters
}

Hibernate明确支持这一点(请参阅),这里没有泄漏的抽象。

您可以使用以下@Table注释引用'group'关键字:

@Entity
@Table(name = "`group`")
public class Group {
...
}

我知道这是对一个老问题的回答,但我认为它可能会帮助别人。

有趣。那它不是冬眠中的一只虫子吗?在我看来,它真的应该被引用,或者至少应该有一个来自Hibernate的明确例外。我不能说竞争软件中的某个东西是否是一个bug(它超出了JPA规范fwiw),但是,如果周围有没有这样的限制的替代方案,并且有明确的方式为其提供支持,那么他们宁愿让该软件的用户来决定是否可以接受这种行为
@Entity
@Table(name="\"Group\"")
public class Group {
  @Id @GeneratedValue
  private Long id;

  @NotNull
  private String name;

  //Getters and Setters
}
@Entity
@Table(name = "`group`")
public class Group {
...
}