如何自定義 JPA 的資料庫命名策略

2021-09-11 16:31:18 字數 4048 閱讀 8020

本次示例的專案中,定義了如下兩個實體:

@data

@entity

public class teacher

@data

@entity

@table(name = "teacher_class")

public class teacherclass

先來看看 jpa 預設的命名策略,我們可以顯示配置如下:

spring:

datasource:

username: root

password: root

url: jdbc:mysql://localhost:3306/test?useunicode=true&characterencoding=utf-8&usessl=false

jpa:

database-platform: org.hibernate.dialect.mysql5innodbdialect

show-sql: true

hibernate:

ddl-auto: create

naming:

# 1. 表名及字段全小寫下劃線分隔命名策略(預設)

physical-strategy: org.springframework.boot.orm.jpa.hibernate.springphysicalnamingstrategy

hibernate: create table teacher (id integer not null auto_increment, name varchar(255), primary key (id)) engine=innodb

hibernate: create table teacher_class (id integer not null auto_increment, class_name varchar(255), teacher_id integer, primary key (id)) engine=innodb

執行專案,通過資料庫或輸出的sql語句,預設策略的表現為:表名及字段全小寫,並以下劃線分隔

此外,引入的 hibernate 還提供了另外一種物理命名策略,先進行如下配置,再來觀察結果:

spring:

datasource:

username: root

password: root

url: jdbc:mysql://localhost:3306/test?useunicode=true&characterencoding=utf-8&usessl=false

jpa:

database-platform: org.hibernate.dialect.mysql5innodbdialect

show-sql: true

hibernate:

ddl-auto: create

naming:

# 2. 物理命名策略,未定義 @table 和 @column 將以實體名和屬性名作為表名及欄位名

physical-strategy: org.hibernate.boot.model.naming.physicalnamingstrategystandardimpl

hibernate: create table teacher (id integer not null auto_increment, name varchar(255), primary key (id)) engine=innodb

hibernate: create table teacher_class (id integer not null auto_increment, classname varchar(255), teacherid integer, primary key (id)) engine=innodb

以上表明,hibernate 提供的命名策略是以實體名和屬性名分別作為表名及欄位名,但如果有定義@table@column,則以該屬性值進行對映命名

當然,某些場景下,可以通過自定義命名策略來簡化操作,或實現自身特定的業務,例如:假設需要為未定義@table實體加上表字首tb_,或是以大寫字母下劃線來分隔定義字段(簡單起見,以下配置並不直接實現physicalnamingstrategy):

public class customnamingstrategyconfig extends springphysicalnamingstrategy 

// 實體名 or 自定義的@tabel name屬性值

string text = name.gettext();

// 首字母大寫(類名),實體未定義@table, 為表名加上tb_字首

if (character.isuppercase(text.charat(0)))

stringbuilder builder = new stringbuilder(text.replace('.', '_'));

for (int i = 1, maxlength = builder.length() - 1; i < maxlength; i++)

}return super.getidentifier(builder.tostring(), name.isquoted(), jdbcenvironment);

} else

}/**

* 判斷是否前乙個字元為小寫字母,當前字元為大寫字母,下乙個字元為小寫字母

** @param before

* @param current

* @param after

* @return

*/private boolean isunderscorerequired(char before, char current, char after)

/*** 配置對映的欄位名

** @param name

* @param jdbcenvironment

* @return

*/@override

public identifier tophysicalcolumnname(identifier name, jdbcenvironment jdbcenvironment) else

}}

spring:

datasource:

username: root

password: root

url: jdbc:mysql://localhost:3306/test?useunicode=true&characterencoding=utf-8&usessl=false

jpa:

database-platform: org.hibernate.dialect.mysql5innodbdialect

show-sql: true

hibernate:

ddl-auto: create

naming:

# 3. 自定義的命名策略

physical-strategy: cn.mariojd.jpa.naming.config.customnamingstrategyconfig

啟動專案,檢視結果,符合以上預設的實現要求

hibernate: create table tb_teacher (id integer not null auto_increment, name varchar(255), primary key (id)) engine=innodb

hibernate: create table teacher_class (id integer not null auto_increment, classname varchar(255), teacher_id integer, primary key (id)) engine=innodb

如何自定義Django資料庫中的字段

新建完專案之後,想要自定義字段 1 建立乙個自定義的字段 2class mycharfield models.field 3def inif self,max lenth,args,kwargs 4 super mycharfield,self init max length max lenth,a...

自定義mysql資料庫函式 資料庫自定義函式

這個為通用過濾關鍵字的函式,若有其他關鍵字未新增可以參考語法加入。use db go object userdefinedfunction dbo f filterstring script date 12 09 2013 17 03 45 set ansi nulls on go set quot...

資料庫PostrageSQL 自定義選項

這個特性被設計用來由附加模組向postgresql新增通常不為系統知道的引數 例如過程語言 這允許使用標準方法配製擴充套件模組。自定義選項有兩部分名稱 乙個副檔名,然後是乙個句點,再然後是正確的引數名,就像sql 中的合格名稱。乙個例子是plpgsql.variable conflict。因為自定義...