【笔记】Spring - Spring Data JPA 自定义命名策略、加入Spring管理

在这里插入图片描述

在Entity实体中,命名方式有两种;

  1. 显示命名(physical-strategy)(非必要): 即通过@Table的name属性指定对应的数据库表名称,@Column的name属性指定实体字段对应数据库字段的名称。
  2. 隐式命名(implicit-strategy)(默认): 交给框架来进行隐式命名。

命名策略分两步走:

  1. 如果我们没有使用@Table或@Column指定了表或字段的名称,则由SpringImplicitNamingStrategy为我们隐式处理,表名隐式处理为类名,列名隐式处理为字段名。如果指定了表名列名,SpringImplicitNamingStrategy不起作用。
  2. 将上面处理过的逻辑名称解析成物理名称。无论在实体中是否显示指定表名列名,SpringPhysicalNamingStrategy都会被调用。

所谓“命名”包括表命名、列命名

如果我们想要自定义命名策略,可以根据自己的需求选择继承下面二者

  • SpringImplicitNamingStrategy 隐式策略
  • SpringPhysicalNamingStrategy 显示策略

然后在配置文件中配置spring.jpa.hibernate.naming.implicit-strategy 或 spring.jpa.hibernate.naming.physical-strategy 进行指定自己的策略

例子: 自定义策略类

为表名添加指定前缀:

配置 application.yml

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: com.lawsssscat.msblog.config.jpa.MySpringPhysicalNamingStrategy 

自定义策略类

/**
 * 自定义命名策略
 *
 * @author caofanqi
 */
public class MySpringPhysicalNamingStrategy extends SpringPhysicalNamingStrategy { // ⚠️jpa3.0改用CamelCaseToUnderscoresNamingStrategy作为默认Strategy
 
 
    /**
     * 为表添加指定前缀
     */
    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        return super.toPhysicalTableName(new Identifier("cfq_" + name.getText(),name.isQuoted()), jdbcEnvironment);
    }
  
}

例子: 加入Spring管理

上述方法定义的Strategy并没有被Spring管理,没法使用Spring的配置。

如果要使用Spring的配置,可以改为下面的写法:

配置 application.yml

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: "MySpringPhysicalNamingStrategy" # ⚠️使用BeanName指定Strategy
        table-prefix: "mstb_"

自定义策略类

package com.lawsssscat.msblog.config.jpa;

import org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * @author lawsssscat
 */
@Component
public class MySpringPhysicalNamingStrategy extends CamelCaseToUnderscoresNamingStrategy {

    @Value("${spring.jpa.hibernate.naming.table-prefix}")
    private String tablePrefix = "tb_";

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        if(name == null) {
            return super.toPhysicalTableName(null, jdbcEnvironment);
        }
        Identifier prefixName = new Identifier(tablePrefix +name.getText(), name.isQuoted());
        return super.toPhysicalTableName(prefixName, jdbcEnvironment);
    }
}

在这里插入图片描述   点赞、收藏、评论 💗

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骆言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值