1、首先在Entity實體中,命名方式有兩種;
一種是顯示命名,即通過@Table的name屬性指定對應的數據庫表名稱,@Column的name屬性指定實體字段對應數據庫字段的名稱。
另一種是隱式命名,顯示命名一般不是必要的,所以可以不設置名稱,交給框架來進行隱式命名。
2、Naming命名策略
我們通過spring-boot-autoconfigure中的spring.factories可以找到自動配置類org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration。
該自動配置類引入JpaBaseConfiguration的實現類HibernateJpaConfiguration來進行hibernate相關的jpa配置;
在JpaBaseConfiguration配置entityManagerFactory時,調用了getVendorProperties方法來獲取供應商屬性,
該方法由HibernateJpaConfiguration實現,當中調用了HibernateProperties的determineHibernateProperties方法,根據標准的JPA屬性和Hibernate設置,確定主Hibernate EntityManagerFactory初始化的配置屬性。

繼續往下走到Naming的applyNamingStrategies應用命名策略可以知道,如果我們不配置命名策略的話,默認由SpringImplicitNamingStrategy和SpringPhysicalNamingStrategy分兩個階段共同完成命名,
先走SpringImplicitNamingStrategy再走SpringPhysicalNamingStrategy。

命名策略分兩步走:
第一步:如果我們沒有使用@Table或@Column指定了表或字段的名稱,則由SpringImplicitNamingStrategy為我們隱式處理,表名隱式處理為類名,列名隱式處理為字段名。如果指定了表名列名,SpringImplicitNamingStrategy不起作用。
第二步:將上面處理過的邏輯名稱解析成物理名稱。無論在實體中是否顯示指定表名列名,SpringPhysicalNamingStrategy都會被調用。
所以如果我們想要自定義命名策略,可以根據自己的需求選擇繼承二者,並在配置文件中通過spring.jpa.hibernate.naming.implicit-strategy 或 spring.jpa.hibernate.naming.physical-strategy 進行指定自己的策略(例如為表名添加指定前綴)。
/** * 自定義命名策略 * * @author caofanqi */ public class MySpringPhysicalNamingStrategy extends SpringPhysicalNamingStrategy { /** * 為表添加指定前綴 */ @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) { return super.toPhysicalTableName(new Identifier("cfq_" + name.getText(),name.isQuoted()), jdbcEnvironment); } }
源碼地址:https://github.com/caofanqi/study-spring-data-jpa