- 参考
- 自定义JPA的数据库命名策略 - https://blog.csdn.net/qq_28804275/article/details/88052399
在Entity实体中,命名方式有两种;
- 显示命名(physical-strategy)(非必要): 即通过@Table的name属性指定对应的数据库表名称,@Column的name属性指定实体字段对应数据库字段的名称。
- 隐式命名(implicit-strategy)(默认): 交给框架来进行隐式命名。
命名策略分两步走:
- 如果我们没有使用@Table或@Column指定了表或字段的名称,则由SpringImplicitNamingStrategy为我们隐式处理,表名隐式处理为类名,列名隐式处理为字段名。如果指定了表名列名,SpringImplicitNamingStrategy不起作用。
- 将上面处理过的逻辑名称解析成物理名称。无论在实体中是否显示指定表名列名,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);
}
}
点赞、收藏、评论 💗