不同的Hibernate命名策略

本文讨论了hibernate提供的不同命名策略,以及命名策略从hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.implicit_naming_strategy和hibernate.physical_naming_strategy的转变。最后,我们将研究一下在Hibernate和配置中实施自定义命名策略以与Spring Boot应用程序一起运行。

Hibernate 4命名策略

Hibernate使用这些策略将Java实体和属性名称与相应的关系数据库和列名称进行映射。 在Hibernate4中,使用的命名策略是hibernate.ejb.naming_strategy。 该策略使用EJB3NamingStrategy , 改良的 NamingStrategy , DefaultComponentSafeNamingStrategy和DefaultNamingStrategy来映射名称。 EJB3NamingStrategy是使用的默认命名策略,它提供驼峰字段和表名。在命名外键列时,它使用undescore(_)作为分隔符。 例如,如果您有一个名称为table1且名称为id和name的表,则在table2中,外键列将被创建为table1_id,并且此EJB3NamingStrategy实现了NamingStrategy接口。

Hibernate 5命名策略

Hibernate 5发布后,由于NamingStrategy合同通常不够灵活以至于无法正确应用给定的命名“规则”,因此hibernate.ejb.naming_strategy不再适用。 取而代之的是,引入了两种新策略来提供对命名策略的深度定制,它们是ImplicitNamingStrategy和PhysicalNamingStrategy。 要使用此策略,有两个要使用的键:implicit_naming_strategy和physical_naming_strategy。Hibernate5仅提供了PhysicalNamingStrategy的一种实现– PhysicalNamingStrategyStandardImpl,但是提供了ImplicitNamingStrategy的几种实现。

当您在实体定义中未明确提供数据库名称和列名称时,将使用ImplicitNamingStrategy,因为PhysicalNamingStrategy可用于显式定义实体名称和属性名称与数据库名称和列名称的映射规则。

隐式命名策略

当实体未明确命名其映射到的数据库表时或当特定属性未明确命名其映射到的数据库列时,将使用ImplicitNamingStrategy。我们可以使用hibernate.implicit_naming_strategy配置设置指定要使用的ImplicitNamingStrategy。默认值是jpa,legacy-hbm,legacy-jpa和component-path。

物理命名策略

PhysicalNamingStrategy的想法是定义自定义命名规则,而不必通过显式名称将其硬编码到映射中。以下是PhysicalNamingStrategy的一种实现,用于定义自定义表名和列名。

package com.devglan;import java.util.LinkedList;
import java.util.List;
import java.util.Locale;import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;import org.apache.commons.lang3.StringUtils;public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy {@Overridepublic Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment jdbcEnvironment) {return name;}@Overridepublic Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment jdbcEnvironment) {return name;}@Overridepublic Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {final List parts = splitAndReplace( name.getText() );return jdbcEnvironment.getIdentifierHelper().toIdentifier(join( parts ),name.isQuoted());}@Overridepublic Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEnvironment) {return name;}@Overridepublic Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment) {final List parts = splitAndReplace( name.getText() );return jdbcEnvironment.getIdentifierHelper().toIdentifier(join( parts ),name.isQuoted());}private LinkedList splitAndReplace(String name) {LinkedList result = new LinkedList<>();for ( String part : StringUtils.splitByCharacterTypeCamelCase( name ) ) {if ( part == null || part.trim().isEmpty() ) {continue;}result.add( part.toUpperCase( Locale.ROOT ) );}return result;}private String join(List parts) {boolean firstPass = true;String separator = "";StringBuilder joined = new StringBuilder();for ( String part : parts ) {joined.append( separator ).append( part );if ( firstPass ) {firstPass = false;separator = "_";}}return joined.toString();}
}

要在Hibernate状态下使用此自定义策略,请执行以下配置。

jpaProperties.put("hibernate.physical_naming_strategy", "com.devglan.config.CustomPhysicalNamingStrategy");

Spring Boot中的Hibernate命名策略

正如我们所讨论的那样,hibernate提供了两种不同的命名策略,而Spring Boot使用SpringPhysicalNamingStrategy配置物理命名策略,其中所有点都由下划线替换,并且驼峰式大写字母由下划线替换,并且所有表名均以小写形式生成。例如,USERDETAILS实体映射到user_details表。

如果要使用上面实现的自定义命名策略,则可以在application.properties中进行以下配置。

spring.jpa.hibernate.naming.physical-strategy=com.devglan.config.CustomPhysicalNamingStrategy);

结论

在本文中,我们了解了Spring Boot和Hibernate提供的不同命名策略以及实现我们自己的自定义命名策略的方法。 如果您有任何要添加或共享的内容,请在下面的评论部分中共享。

翻译自: https://www.javacodegeeks.com/2018/03/different-hibernate-naming-strategy.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333862.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设置按峰值带宽计费_西部数码使用指南:云服务器计费模式说明

版权归西部数码所有&#xff0c;原文链接&#xff1a;https://www.west.cn/faq/list.asp?unid2370一、付费模式1、包年包月先付费后使用模式&#xff0c;资源固定&#xff0c;按年或者按月付费购买可享受较大的价格优惠&#xff0c;帮您更大程度节省支出&#xff0c;并且时间固…

信号处理基本概念

信号处理 信号是传递信息的函数&#xff0c;也是独立变量的函数&#xff0c;这个变量可以是时间空间位置等。如图像的灰度值等就是空间位置的函数&#xff0c;声压随着时间在变化&#xff0c;就是时间的函数。 连续信号就是在某个时间区间&#xff0c;除有限间断点外所有瞬时…

如何理解计算机程序中的宏?

计算机科学里的宏是一种抽象&#xff08;Abstraction&#xff09;&#xff0c;它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言&#xff0c;宏展开在编译时发生&#xff0c;进行宏展开的工具常被称为宏展开器。 宏…

过滤器过滤特定的url_如何从过滤器中排除URL

过滤器过滤特定的url默认情况下&#xff0c;过滤器不支持排除特定的URL模式&#xff0c;每当您为过滤器定义URL模式时&#xff0c;任何与该模式匹配的请求都将由过滤器无例外处理。 从过滤器中排除URL的最简单方法是将过滤器映射到非常特定的模式。 在早期开发阶段完成此操作是…

计算机网络视频笔记

计算机网络计算机网络和互联网计算机网络(简称网络)internet(互连网)网络的组成网路边缘网络核心应用层传输层(运输层)网络层&#xff1a;数据链路层和局域网物理层网络安全无线和移动网络多媒体网络网络管理计算机网络和互联网 计算机网络(简称网络) 由若干结点和连接这些结…

一个dsp最小系统至少要有_DSP最小系统电路设计

DSP最小系统电路设计第1章绪论DSP有两种涵义&#xff0c;一种是Digital Signal Processing&#xff0c;指的是数字信号处理技术&#xff1b;一种是DigitalSignalProcessor&#xff0c;指的是数字信号处理器。两者是不可分割的&#xff0c;前者是理论上的技术&#xff0c;要通过…

g++默认字符集utf-8_Java可能使用UTF-8作为其默认字符集

g默认字符集utf-8由于基于Java的应用程序通常用于各种各样的操作系统和环境中&#xff0c;因此Java开发人员会遇到与基于字符的输入和输出有关的问题并不少见。 涉及这些问题的博客文章包括《警察的恐怖&#xff1a;默认语言环境&#xff0c;默认字符集和默认时区》 &#xff1…

Linux 的权限表达式

文章目录一、采用权限字母和操作符表达式&#xff08;一&#xff09;授权对象&#xff08;二&#xff09;权限字母符号二、采用权限数字表达式&#xff08;一&#xff09;权限数字&#xff08;二&#xff09;权限组合&#xff08;三&#xff09;命令 chmod 后面的数字含义一、采…

nat 网卡间数据包转发_nat端口转发示例

nat端口转发示例环境&#xff1a;A服务器&#xff1a; 网卡1:192.168.1.151 网卡2:10.10.69.10B服务器&#xff1a; 网卡1:10.10.69.41要求&#xff1a;访问192.168.1.151:1521 即访问 10.10.69.41:1521启用端口转发&#xff1a;echo 1 > /proc/sys/net/ipv4/ip_forward清空…

精通 RPM 之查询篇

文章目录一、命令格式二、选项详解&#xff08;一&#xff09;查询所有已安装的软件包&#xff08;二&#xff09;查询有哪些软件包属于指定的类别&#xff08;三&#xff09;查询有哪些软件包拥有指定文件&#xff08;四&#xff09;查询有哪些包需要指定功能&#xff08;五&a…

如何判断2服务器性能好或坏_无服务器革命:好,坏和丑

如何判断2服务器性能好或坏“这是愚蠢的。 比愚蠢还糟&#xff1a;这是一场营销炒作。” ‐ 理查德斯托曼 &#xff08; Richard Stallman&#xff09;对云计算的评论&#xff0c;2008年9月 而且&#xff0c;十年后&#xff0c;当有人提到这个词时&#xff0c;您开始三思而后…

datax 持续数据同步_采用DataX实现多表增量数据同步

这两天验证了一下阿里的DataX数据同步工具&#xff0c;觉得DataX可以用来做管理数据的多级数据同步。DataX用来做批量数据迁移很适合&#xff0c;能够保证数据的一致性&#xff0c;性能也很好&#xff0c;结合时间戳字段&#xff0c;用来实现数据定时增量同步也是可以的&#x…

Linux RPM包校验和数字证书

文章目录一、Linux RPM 包校验二、Linux RPM 数字证书验证&#xff08;一&#xff09;使用数字证书验证 RPM 包的步骤&#xff08;二&#xff09;安装/卸载数字证书为了能够及时发现文件误删、误修改文件数据、恶意篡改文件内容等问题&#xff0c;Linux 提供了以下两种检测方式…

java 字符串文字筛选_Java的原始字符串文字

java 字符串文字筛选似乎“ 原始字符串文字 ”即将出现在Java中。 JEP 326开始的&#xff08;“原始字符串字面量”&#xff09; 发行JDK-8196004 &#xff0c;并宣布为“新JEP候选人” 3月2日的JEP和相关问题的人指出&#xff0c;“Java的仍然是一小群现代编程语言中的一个不为…

计算机系统常识笔记

计算机系统常识操作系统篇LinuxWindowsAndroidIOSUNIXGNU(GNUs Not Unix!)MacOSDOS处理器(CPU)篇x86ARM处理器显卡(GPU)篇分类性能指标显示存储器显卡频率显存类型流处理器单元显存位宽总线接口类型按当前主流显卡等级划分编译器篇公司篇IntelAMDNVIDIAMicrosoft(微软)IBMOracl…

jsr303jsp页面怎么显示错误信息_springmvc使用JSR-303进行数据校验实例

项目中&#xff0c;通常使用较多的是前端的校验&#xff0c;比如页面中js校验以及form表单使用bootstrap校验。然而对于安全要求较高点建议在服务端进行校验。服务端校验&#xff1a;控制层controller&#xff1a;校验页面请求的参数的合法性。在服务端控制层controller校验&am…

spring @lazy_Spring @Lazy批注用例

spring lazySpring框架几乎可以毫不费力地为您解决许多常见的编程问题&#xff0c;但是其某些功能比其他功能鲜为人知。 在本文中&#xff0c;我们将仔细研究属于该组的Lazy批注。 阅读了几个示例之后&#xff0c;您应该能够将注释应用于日常开发任务。 1. 懒豆初始化 Spring的…

什么是虚数

在数学中&#xff0c;虚数就是形如 ab*i 的数&#xff0c;其中 a、b 是实数&#xff0c;且 b≠0&#xff0c;i -1。虚数这个名词是 17 世纪著名数学家笛卡尔创立&#xff0c;因为当时的观念认为这是真实不存在的数字。后来发现虚数 ab*i 的实部 a 可对应平面上的横轴&#xff…

计算机网络--接入互联网方式

接入网 指将端系统物理连接到其边缘路由器的网络。边缘路由器是端系统到任何其他远程端系统的路径上的第一台路由器。 1.家庭接入互联网方式 一般通过DSL、电缆、FTTH、拨号和卫星接入。 数字用户线(DSL) 住户通常从提供本地电话接入的本地电话公司处获得DSL因特网接入。因…

mysqls压力测试怎么用_MySQL压力测试工具使用

一、MySQL自带的压力测试工具——Mysqlslapmysqlslap是mysql自带的基准测试工具,该工具查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较。mysqlslap为mysql性能优化前后提供了直观的验…