当前位置: 首页 > 面试题库 >

Hibernate表和列的自动保留字转义

吴建中
2023-03-14
问题内容

我正在尝试对多个不同的数据库使用一种Hibernate映射:H2,Oracle,MySql。

每个数据库都有一个不同的保留字列表。

我希望Hibernate自动转义保留字。

我知道我可以:

  • 使用反引号强制转义(为了安全起见,请逃避一切)
  • 更改所有标识符,使它们在任何数据库中都肯定不是关键字(使它们难看)
  • 将模式绑定到一组特定的数据库,转义关键字的并集(如果将新数据库添加到组合中,则会中断)

有没有更优雅的解决方案?


问题答案:

AFAIK,Hibernate不会维护(每个数据库)保留关键字的列表,因此我认为您应该查看数据库标识符转义。

如果您使用的是Hibernate
3.5+,请尝试hibernate.globally_quoted_identifiers=true引用所有数据库标识符(这是为JPA 2.0添加的
名称 ,请参阅规范的 2.13节“数据库对象命名” ,以了解使用JPA激活该功能的JPA方法)。

在3.5版之前,Hibernate不提供任何用于全局转义的配置选项。建议采用实现自定义NamingStrategy以透明地转义所有内容的方法。

也可以看看

  • 数据库独立的列/表名称是否转义?
  • HHH-2578-重新设计SessionFactory建筑物 -我的理解是,解决此问题将使自动转义关键字(通过方言)成为可能。


 类似资料:
  • 问题内容: 我似乎在Hibernate中映射列表时遇到问题。在我们的项目中有一类用含有类与含有。 Hibernate 是否可以使用注释进行映射?我的意思是,因为它没有注释? 问候 问题答案: 用途: 资料来源: 7.2.3。基本类型和可嵌入对象的集合

  • 问题内容: 我用下面的查询来获得与指数,以及: …但似乎是保留字。例如可以。MySQL使用反引号转义的当前方式是如何在HQL中转义 别名 ? 使用反引号会出现以下错误: 问题答案: 您可以通过使用自定义“别名映射”转换器的解决方法来实现,因此您的代码将更改为如下所示 然后使用此类:

  • 所以我有一个递归程序,我试图生成一个字符串的所有排列。我打算将排列存储在一个名为ans的列表中。 每个当前排列都存储在用于填充ans列表的容器列表中。我怀疑,因为列表是一种引用类型,所以我可能会因为容器列表被操纵而丢失ans列表中的值?我是白痴吗

  • 问题内容: 我们希望从mySQL获取一个自动递增的ID,而无需实际存储它,直到其他与mysql不相关的进程成功完成为止,这样,如果发生异常或应用程序崩溃,就不会存储该条目。我们需要使用ID作为其他进程的密钥。本质上,我们要“保留”自动增量,并将最后一行插入到mySQL中。我们不希望在知道整个过程成功完成之前插入任何行。 可以在mySQL中进行这种自动增量保留吗? 注意:我了解SQL事务。但是,我们

  • 为了便于编程,CodeIgniter使用了一系列的函数和名称来完成操作。所以,有些名称不能被程序员使用。下面是不能被程序员使用的保留字列表。 控制器 因为你的控制器类将继承主程序控制器,所以你的函数命名一定不能和主程序控制器类中的函数名相同,否则你的局部函数将会覆盖他们。下面列出了已经保留的名称,请不要将你的控制器命名为这些: Controller CI_Base _ci_initialize D

  • ECMA-262 描述了一组具有特定用途的关键字,这些关键字可用于表示控制语句的开始或结束,或者用于执行特定操作等。按照规则,关键字也是语言保留的,不能用作标识符。以下就是 ECMAScript的全部关键字(带*号上标的是第 5 版新增的关键字): ECMA-262 还描述了另外一组不能用作标识符的保留字。尽管保留字在这门语言中还没有任何特定的用途,但它们有可能在将来被用作关键字。以下是 ECMA