Hibernate命名策略详解

Hibernate命名策略详解

Hibernate是一个Java持久化框架,可以将Java对象和关系型数据库中的数据进行映射。在使用Hibernate时,我们可以使用不同的命名策略来生成数据库表格名、列名、主键名等信息。本文将详细讲解Hibernate的命名策略,帮助读者了解不同的命名策略,并选择适合自己的命名策略。

命名策略分类

在Hibernate中,主要有三种命名策略:

  1. 物理命名策略:使用底层数据库中的实际名称。例如,如果表格在数据库中的名称是"USER",那么在Hibernate中,表格的名称也是"USER"。
  2. 逻辑命名策略:使用Java实体类中的名称,将Java名称转换为数据库中的名称。例如,如果Java实体类的名称是"User",那么在Hibernate中,表格的名称可能是"user"或"t_user"。
  3. 显式命名策略:使用注释或XML配置文件的名称。这种方式比较灵活,可以根据自己的需要指定名称。

物理命名策略

在Hibernate中,默认情况下,物理命名策略是基于底层数据库的。也就是说,如果使用的是MySQL数据库,Hibernate将默认使用MySQL的物理命名策略,表格、列名等名称与MySQL的规范一致。如果使用的是Oracle数据库,Hibernate将使用Oracle的物理命名策略。

逻辑命名策略

在Hibernate中,可以使用不同的逻辑命名策略,根据自己的需求选择适合自己的方式。一般来说,逻辑命名策略包括以下几种:

  • ImpliedStrategy:使用Java实体类的名称来指定表格、列名等名称。例如,Java实体类的名称是"User",那么对应的表格、列名为"user"或"t_user"。
  • PhysicalNamingStrategyStandardImpl:根据Java实体类中属性名称的规范和Hibernate的规则生成表格、列名等名称。
  • ImprovedNamingStrategy:将Java实体类中属性名称和Hibernate的规则相结合,产生表格、列名等名称。
  • CustomNamingStrategy:用户自定义命名策略,可以根据自己的需求编写。
//示例1: 使用ImprovedNamingStrategy命名策略
package com.example.demo;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.hibernate.id.enhanced.SequenceStyleGenerator;

public class MyNamingStrategy extends org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl {

    @Override
    public Identifier determineIdentifier(
            final JdbcEnvironment jdbcEnvironment,
            final String entityName,
            final org.hibernate.boot.model.naming.EntityNaming entityNaming) {
        final Identifier id = super.determineIdentifier(jdbcEnvironment, entityName, entityNaming);
        if (id != null) {
            return Identifier.toIdentifier("t_" + id.getText());
        } else {
            return id;
        }
    }

    @Override
    public Identifier determineJoinColumnName(
            final JdbcEnvironment jdbcEnvironment,
            final Identifier sourceIdentifier,
            final Identifier targetIdentifier) {
        final Identifier identifier = this.toIdentifier("id");
        return this.getNamingHelper().concatenate(
                identifier,
                this.determineIdentifier(
                        jdbcEnvironment,
                        sourceIdentifier.getText(),
                        (org.hibernate.boot.model.naming.EntityNaming) null
                ),
                this.determineIdentifier(
                        jdbcEnvironment,
                        targetIdentifier.getText(),
                        (org.hibernate.boot.model.naming.EntityNaming) null
                )
        );
    }

    @Override
    public Identifier determineForeignKeyName(
            final JdbcEnvironment jdbcEnvironment,
            final org.hibernate.boot.model.naming.ForeignKey foreignKey) {
        final Identifier identifier = this.toIdentifier("fk");
        final StringBuilder builder = new StringBuilder(30)
                .append(identifier.getText())
                .append("_")
                .append(foreignKey.getTable().getName())
                .append("_")
                .append(foreignKey.getReferencedTable().getName())
                .append("_")
                .append(foreignKey.getColumnNames().hashCode());
        return Identifier.toIdentifier(builder.toString());
    }

}

//示例2:在application.properties配置文件中设置逻辑命名策略
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl

显式命名策略

在Hibernate中,可以使用注释或XML配置文件来指定表格、列名等名称。这种方式比较灵活,可以根据自己的需求来设置。例如,可以在实体类中使用@Table(name = "USER")注释来指定表格的名称,或者在XML配置文件中使用<table name="USER">来指定表格的名称。

//示例3:使用@Table注解来指定表格名称
@Entity
@Table(name = "USER")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    private String password;

    //省略getter和setter
}

综上所述,Hibernate的命名策略非常灵活。可以根据自己的需要选择不同的命名策略,并编写自己的命名策略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Hibernate命名策略详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java8中stream和functional interface的配合使用详解

    下面我将给出一个详细讲解“Java8中stream和functional interface的配合使用”的攻略: 一、什么是stream和functional interface 1.1 stream 在Java中,Stream是Java 8提供的一个新特性。Stream提供了一种更便捷的方式来处理集合数据,可以实现很多操作,比如过滤,排序和统计等。Stre…

    Java 2023年5月26日
    00
  • 关于@JSONField和@JsonFormat的使用区别说明

    当我们在Java中使用JSON进行数据传递和解析时,通常使用的是JSON格式。在进行序列化和反序列化时,我们会经常使用@JSONField和@JsonFormat注解。虽然它们都可以在实现JSON序列化和反序列化时使用,但它们在使用时有一些区别。 @JSONField 和 @JsonFormat 的使用区别说明 1. @JSONField注解 该注解通常用于…

    Java 2023年5月26日
    00
  • Java 实现微信和支付宝支付功能

    Java 实现微信和支付宝支付功能的完整攻略 准备工作 首先需要注册微信和支付宝的开发者账号,获取相应的开发者ID和密钥。 根据官方文档下载相应的SDK包,并将其导入到项目中。 接入支付功能需要一个网站或App,需要先部署好网站或App,并申请相应的证书(微信需要HTTPS证书)。 微信支付功能的实现步骤 准备工作 在微信公众平台申请开通微信支付功能,获取w…

    Java 2023年5月20日
    00
  • 微信小程序开发实现首页弹框活动引导功能

    下面是“微信小程序开发实现首页弹框活动引导功能”的详细攻略: 步骤一:创建活动弹框组件 在项目中创建一个名为activity-modal的活动弹框组件。 在activity-modal组件的WXML文件中定义一个自定义弹框,并设置其显示和隐藏的属性: <view class="activity-modal" hidden=&quot…

    Java 2023年5月23日
    00
  • Java二维数组与稀疏数组相互转换实现详解

    Java二维数组与稀疏数组相互转换实现详解 二维数组与稀疏数组在Java中是常见的数据结构,二维数组用来表示二维网格数据,稀疏数组用来表示大部分元素都是相同值的数组。本篇攻略将详细讲解Java中如何实现二维数组与稀疏数组的相互转换。 1. 二维数组转稀疏数组 实现过程:1. 遍历二维数组,统计非零元素的个数count。2. 创建一个稀疏数组sparseArr…

    Java 2023年5月26日
    00
  • spring框架_Applicationcontext功能

    Applicationcontext的功能拓展主要来自于不属于beanfactory的接口,主要包括四个接口 Messagesource :国际化 ResourcePatternResolver :获取资源 ApplicationEventPublisher:发布事件 EnvironmentCapable:获取环境变量 感觉发布事件这个功能有点像消息队列,发…

    Java 2023年5月9日
    00
  • 浅谈java二进制、十进制、十六进制、字符串之间的相互转换

    Java进制转换攻略 Java中提供了十进制、二进制、八进制、十六进制的进制表示,同时也支持将不同进制之间进行转换,并提供字符串和数字之间的转换方法。 十进制转换为其他进制 十进制转二进制 Java中可以使用 Integer 类的 toBinaryString 方法将十进制数转换为二进制字符串,例如: int decimalNum = 123; String…

    Java 2023年5月27日
    00
  • Java终止循环体的具体实现

    Java终止循环体可以使用break和continue两个关键字实现,这两个关键字可以在循环体内使用。 使用break关键字终止循环体 当循环体内部的条件满足某个条件时,可以使用break关键字终止循环体的执行。下面是一个使用break关键字的示例: for (int i = 0; i < 10; i++) { if (i == 5) { break;…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部