【问题标题】:Using reserved JPQL keywords with JPA在 JPA 中使用保留的 JPQL 关键字
【发布时间】:2011-01-10 08:46:41
【问题描述】:

我有一个名为“Group”的实体类,NetBeans 警告我“实体表名称是保留的 Java Persistence QL 关键字”。

类似的情况是使用保留的 SQL 关键字。

这个名字会被转义吗?使用不同的表名会解决@Table(name="otherName") 的问题吗?还是我应该重命名课程?

【问题讨论】:

    标签: java orm jpa jakarta-ee jpql


    【解决方案1】:

    这个名字会被转义吗?

    JPA 规范中没有这样说,如果您的提供者这样做,这是特定于提供者的。

    使用不同的表名会解决问题@Table(name="otherName")

    显然,它会(当然,只要您不使用另一个保留关键字)。但是,如果您使用的是 JPA 2.0 提供程序,则有一种标准方法可以使用双引号对 db 对象名称进行转义:

    @Table(name="\"Group\"")
    

    在 JPA 1.0 中,没有任何标准,这取决于您的 JPA 提供者。例如,Hibernate 使用反引号:

    @Table(name="`Group`")
    

    或者我应该重命名课程吗?

    没有。实体的表名默认为实体名,但您可以使用我们看到的@Table 注释来控制它。因此无需更改实体的类名。

    【讨论】:

    • 如果您使用这样的引号,任何组合表(例如 OneToMany 关系)都将无法创建(“Group”_Members f.e. 是无效名称)。此解决方案是一种 hack,我建议不要为表使用保留名称。字段名称不是问题。
    【解决方案2】:

    您不必重命名类 - 也不应该 - 您选择的名称以最好的方式反映了您的域,并且您不应该因为工具或框架的限制而更改它,以防工具/框架提供了一种避免“冲突”的方法。 JPA 提供了这种方式。

    【讨论】:

    • 不,@Entity(name"foo") 的名称元素是别的东西,它用于定义要在 JPQL 查询中使用的名称。它与数据库对象有关。
    猜你喜欢
    • 2010-10-09
    • 2012-11-23
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多