Spring Boot 学习研究笔记(八) - Spring Data JPA与Hibernate区别及配置(2)

简介: Spring Boot 学习研究笔记(八) - Spring Data JPA与Hibernate区别及配置

(1)、spring.jpa.hibernate.ddl-auto 配置

该配置的主要作用是:自动创建、更新、验证数据库表结构,该参数的几种配置如下:

  • create: 每次加载 hibernate 时都会删除上一次生成的表,然后根据 modle 类再重新生成新表,哪怕两次没有任何改变也要这样执行。这也是导致数据库表数据丢失的一个重要原因。
  • create-drop :每次加载 hibernate 时根据 modle 类生成表,但是SessionFactory 一关闭,表就会自动删除。
  • update :最常用的属性,第一次加载hibernate 时,根据modle 类会自动建立表的架构(前提是先建立好数据库),以后加载hibernate 时根据 modle 类自动更新表结构,即使表结构改变了,但表中的行仍然存在,不会删除以前的行。要注意的是:当部署到服务器后,表结构不会马上建立起来。要等应用第一次运行起来才会。
  • validate:每次加载hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
Mode Reads**import.sql** Alters Database**Structure** Comments
update No Yes  
create Yes Yes Empties the database before creating it
create-drop Yes Yes Drops the database when the SessionFactory is closed
validate No No  

 

(2)、spring.jpa.properties.hibernate.dialect 配置

hibernate.dialect 属性的属性值为 Hibernate 所支持的 SQL 方言,如下表:

数据库 Hibernate方言类
DB2 org.hibernate.dialect.DB2Dialect
DB2 AS/400 org.hibernate.dialect.DB2400Dialect
DB2 OS390 org.hibernate.dialect.DB2390Dialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
MySQL org.hibernate.dialect.MySQLDialect
MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle(any version) org.hibernate.dialect.OracleDialect
Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server org.hibernate.dialect.SQLServerDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Informix org.hibernate.dialect.InformixDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
Ingres org.hibernate.dialect.IngresDialect
Progress org.hibernate.dialect.ProgressDialect
Mckoi SQL org.hibernate.dialect.MckoiDialect
Interbase org.hibernate.dialect.InterbaseDialect
Pointbase org.hibernate.dialect.PointbaseDialect
FrontBase org.hibernate.dialect.FrontbaseDialect
Firebird org.hibernate.dialect.FirebirdDialect

2、命名策略配置

其中Naming是一个内部类,Hibernate字段映射策略就是在这里配置的。

 

根据上面的代码可知,Naming采用下面两个属性:

spring.jpa.hibernate.naming.implicit-strategy= # Hibernate 5 implicit naming strategy fully qualified name.

spring.jpa.hibernate.naming.physical-strategy= # Hibernate 5 physical naming strategy fully qualified name.

现在分别介绍这两个属性分别怎么使用

(1)、physical-strategy的使用:

spring.jpa.hibernate.naming.physical-strategy 它有两个值分别可以配置:

org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

效果分别如下:

org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl效果等同于:

 hibernate4中的DefaultNamingStrategy这个直接映射,不会做过多的处理(前提没有设置@Table,@Column等属性的时候)。如果有@Column则以@Column为准【对于关联关系的依旧会命名为user_id这种样子,看下图】

org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy效果等同于:

 hibernate4中的ImprovedNamingStrategy 表名,字段为小写,当有大写字母的时候会转换为分隔符号“_”。

 

(2)、implicit-strategy的使用:

spring.jpa.hibernate.naming.implicit-strategy 它有如下的值可以配置:

org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImp

org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl

org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl

下表说明各个策略的差异:

strategy primaryTable joinTable collectTable
ImplicitNamingStrategyJpaCompliantImpl Entity类名 Entity物理名称 + 引用Entity的物理名称 Entity类名 + 属性名称
ImplicitNamingStrategyLegacyHbmImpl - Entity物理名称 + 属性名称 -
ImplicitNamingStrategyLegacyJpaImpl - - Entity物理名称 + 属性名称
SpringImplicitNamingStrategy - Entity的物理名称 + 属性名称 -

(3)、自定义命名策略的使用:

A、首先,介绍下命名策略的步骤:

   第一步:如果我们没有使用@Table或@Column指定了表或字段的名称,则由SpringImplicitNamingStrategy为我们隐式处理,表名隐式处理为类名,列名隐式处理为字段名。如果指定了表名列名,SpringImplicitNamingStrategy不起作用。

   第二步:将上面处理过的逻辑名称解析成物理名称。无论在实体中是否显示指定表名列名,SpringPhysicalNamingStrategy都会被调用。


   所以如果我们想要自定义命名策略,可以根据自己的需求选择继承二者,并在配置文件中通过spring.jpa.hibernate.naming.implicit-strategy 或 spring.jpa.hibernate.naming.physical-strategy 进行指定自己的策略(例如为表名添加指定前缀)。

 

B、其次自定义命名策略,通过继承PhysicalNamingStrategyStandardImpl 或实现PhysicalNamingStrategy 接口:

package com.yozheng.springboot.demo.common;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
 * 自定义数据库映射名称策略
 */
@Component
public class DataBaseNamingStrategy implements PhysicalNamingStrategy {
    @Value("${database.prefix}")
    private String prefix;  //读取application.properties配置的前缀
    protected String addUnderscores(String name) {
        if (name == null) {
            return null;
        }
        StringBuffer stringBuffer = new StringBuffer(name.replace('.', '_'));
        for (int i = 1; i < stringBuffer.length() - 1; i++) {
            if (Character.isLowerCase(stringBuffer.charAt(i-1)) && Character.isUpperCase(stringBuffer.charAt(i)) && Character.isLowerCase(stringBuffer.charAt(i+1))) {
                stringBuffer.insert(i++, '_');
            }
        }
        return stringBuffer.toString().toLowerCase();
    }
    @Override
    public Identifier toPhysicalCatalogName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return identifier;
    }
    @Override
    public Identifier toPhysicalSchemaName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return identifier;
    }
    @Override
    public Identifier toPhysicalTableName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return Identifier.toIdentifier(prefix + addUnderscores(identifier.getText()));
    }
    @Override
    public Identifier toPhysicalSequenceName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return identifier;
    }
    @Override
    public Identifier toPhysicalColumnName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return Identifier.toIdentifier(addUnderscores(identifier.getText()));
    }
}

 

只需要实现上面:toPhysicalTableName(这个是映射表名), toPhysicalColumnName(映射字段名称)

c、 在application.properties文件配置信息

#配置自定义命名策略

spring.jpa.hibernate.naming.physical-strategy=com.example.demo.DataBaseNamingStrategy

#数据库表名前缀

database.prefix=tb_

 

运行测试效果:

 

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
1447 0
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
1992 0
|
11月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
710 4
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1967 5
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
700 0
探索Spring Boot的@Conditional注解的上下文配置
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1687 10
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
409 2
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
1763 1
|
Java API 数据库
JPA简介:Spring Boot环境下的实践指南
上述内容仅是JPA在Spring Boot环境下使用的冰山一角,实际的实践中你会发现更深更广的应用。总而言之,只要掌握了JPA的规则,你就可以借助Spring Boot无比丰富的功能,娴熟地驾驶这台高性能的跑车,在属于你的程序世界里驰骋。
580 15
|
SQL Java 编译器
深入理解 Spring Data JPA 的导入与使用:以 UserRepository为例
本文深入解析了 Spring Data JPA 中 `UserRepository` 的导入与使用。通过示例代码,详细说明了为何需要导入 `User` 实体类、`JpaRepository` 接口及 `@Repository` 注解。这些导入语句分别用于定义操作实体、提供数据库交互方法和标识数据访问组件。文章还探讨了未导入时的编译问题,并展示了实际应用场景,如用户保存、查询与删除操作。合理使用导入语句,可让代码更简洁高效,充分发挥 Spring Data JPA 的优势。
884 0