Hibernate 将JPA实体命名为“JPA”是否违法;“组”吗;?
我正在开发一个JEE6应用程序,使用JPA2.0和Hibernate 3.5.2-Final作为提供程序(以及MySQL 5.1.41)。我的应用服务器是Glassfish V3.0.1。 我已经有了一个可以工作的CRUD应用程序,其中包含一些实体和关系 现在,我添加了一个名为“Group”的实体(非常简单)。实体类如下所示: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
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,将名称指定为
使用双精度分隔的标识符
引号,例如,
- 通过使用注释,名称由指定为分隔标识符
将名称包含在double中
引号,其中内部引号是
逃脱,例如。,
表
,如下所示:
@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 {
...
}