Hibernate命名策略详解

yizhihongxing

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日

相关文章

  • feign post参数对象不加@RequestBody的使用说明

    关于“feign post参数对象不加@RequestBody的使用说明”,我将分以下几个方面进行详细讲解: @RequestBody注解的作用 不加@RequestBody的使用说明 示例说明 小结 1. @RequestBody注解的作用 首先,我们需要了解@RequestBody注解的作用。该注解用于将请求体中的参数绑定到方法参数上。即,使用该注解后,…

    Java 2023年5月23日
    00
  • IntelliJ IDEA基于SpringBoot如何搭建SSM开发环境的步骤详解

    IntelliJ IDEA基于SpringBoot如何搭建SSM开发环境的步骤详解 1. 环境准备 在开始搭建SSM开发环境之前,我们需要准备以下环境: JDK 1.8或以上版本 IntelliJ IDEA Maven SpringBoot 2. 创建SpringBoot项目 在IntelliJ IDEA中创建一个SpringBoot项目,可以使用Sprin…

    Java 2023年5月18日
    00
  • hadoop入门之通过java代码实现将本地文件上传到hadoop的文件系统

    下面是 “Hadoop入门之通过Java代码实现将本地文件上传到Hadoop的文件系统”的攻略。 步骤一:安装Hadoop 首先需要安装配置好Hadoop。具体安装过程这里不再赘述,可以参考官方文档:https://hadoop.apache.org/docs/r3.2.2/index.html 步骤二:引入Hadoop的依赖包 在java项目中使用Hado…

    Java 2023年5月20日
    00
  • 对象终结器的实现原理是什么?

    对象终结器(Finalizer)是一种在 .NET 环境下的管理器,用于在垃圾回收器(Garbage Collector,GC)释放对象前执行一些必要的清理操作,例如关闭文件、释放资源等。但是,使用对象终结器需要注意许多事项。本文将详细讲解对象终结器的实现原理和正确使用方式,以及许多注意事项。 对象终结器的实现原理 每个 .NET 对象都有一个对象头,包含对…

    Java 2023年5月11日
    00
  • 一篇带你入门Java垃圾回收器

    一篇带你入门Java垃圾回收器 什么是Java垃圾回收器 Java垃圾回收器(Garbage Collector)是Java虚拟机(JVM)的重要组成部分。它管理内存分配和回收,以确保在应用程序运行期间,不会发生内存泄漏或溢出等问题。 垃圾回收器的工作原理 垃圾回收的核心是判断哪些内存块是“垃圾”,然后将其回收。在JVM中,垃圾回收器通过判断对象是否还被引用…

    Java 2023年5月26日
    00
  • 在js与java中判断json数据中是否含有某字段的案例

    在 JS 中判断 JSON 数据中是否含有某字段的方法如下: 使用 in 运算符: const jsonData = { name: ‘Tom’, age: 18 }; if (‘name’ in jsonData) { console.log(‘jsonData 存在 name 字段’); } 使用 hasOwnProperty() 方法: const j…

    Java 2023年5月26日
    00
  • Spring Boot 从静态json文件中读取数据所需字段

    下面我来为你详细讲解一下“Spring Boot 从静态json文件中读取数据所需字段”的攻略。 准备工作 首先,我们需要在Spring Boot应用程序中添加依赖: <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>j…

    Java 2023年5月26日
    00
  • Java的Struts框架报错“NullActionForwardException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“NullActionForwardException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会出现此。在这种情况下,需要检查文件以解决此问题。 转发名称:如果转发名称不正确,则可能出现此。在这种情况下,需要检查转发名称以解决此问题。 以下是两个实例: 例 1 如果配置…

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