學習Spring-Data-Jpa(四)---Naming命名策略,源碼跟蹤


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
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM