本次示例的專案中,定義了如下兩個實體:
@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。因為自定義...