Jpa多數(shù)據(jù)源束铭,為每個(gè)數(shù)據(jù)源配置單獨(dú)的命名策略

起因:

  • spring data jpa多數(shù)據(jù)源配置可以參考Jpa多數(shù)據(jù)源配置蒋院,我就是參考這篇文章配置好的。
  • 我的數(shù)據(jù)源有兩個(gè)剑肯,一個(gè)是mysql捧毛,一個(gè)是sqlserver。
  • mysql數(shù)據(jù)庫(kù)的表字段形式采用的是jpa默認(rèn)的命名策略让网,實(shí)體屬性采用currentUserName形式的駝峰命名呀忧,映射時(shí)自動(dòng)將大寫轉(zhuǎn)換為小寫,并用_(下劃線)連接溃睹,即current_user_name而账。
  • 但是sqlserver數(shù)據(jù)庫(kù)中表中字段的命名為CurrentUserName這種形式。所以在映射的時(shí)候會(huì)報(bào)異常--無(wú)效的列名因篇。即使在相關(guān)實(shí)體的字段上添加@column注解泞辐,但是仍然無(wú)效。
  • 經(jīng)過(guò)查找資料竞滓,原因是因?yàn)閖pa默認(rèn)的命名策略為spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy咐吼,采用這種命名策略,@column注解會(huì)失效商佑。網(wǎng)上的解決辦法都是單數(shù)據(jù)源的配置锯茄,都不能解決我當(dāng)前項(xiàng)目遇到的問(wèn)題。
  • 無(wú)奈只能自己解決茶没。

解決辦法

  • 依照上面的參考文章肌幽,多數(shù)據(jù)源配置中有這么一段代碼,如下:
    //注入JPA配置實(shí)體
    @Autowired
    private JpaProperties jpaProperties;

    //獲取jpa配置信息
    private Map<String, String> getVendorProperties(DataSource dataSource) {
        return jpaProperties.getHibernateProperties(dataSource);
    }

  • return jpaProperties.getHibernateProperties(dataSource);這段代碼前加上以下代碼:
jpaProperties.getHibernate().getNaming().setPhysicalStrategy("org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl");

即:

//獲取jpa配置信息
    private Map<String, String> getVendorProperties(DataSource dataSource) {
        jpaProperties.getHibernate().getNaming().setPhysicalStrategy("org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl");
        return jpaProperties.getHibernateProperties(dataSource);
    }

  • jpa的默認(rèn)配置有兩個(gè)抓半,可以根據(jù)需要做選擇:
    //spring物理命名策略--不對(duì)屬性名做任何改變
    private static final String DEFAULT_PHYSICAL_STRATEGY = "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy";
    
    //spring隱式命名策略--對(duì)屬性名做下劃線連接處理喂急,并將大寫改為小寫
    private static final String DEFAULT_IMPLICIT_STRATEGY = "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy";

  • jpa默認(rèn)的命名策略不能夠滿足可以自定義命名策略,網(wǎng)上有相關(guān)的示例琅关,不再贅述煮岁。

我們看下這句配置所涉及的源碼:
  • HibernateNamingJpaProperties的兩個(gè)內(nèi)部類
@ConfigurationProperties(prefix = "spring.jpa")
public class JpaProperties {

       ......省略

       private Hibernate hibernate = new Hibernate();

       public Hibernate getHibernate() {
          return this.hibernate;
       }

      ......省略

  ......省略
  public static class Hibernate {

          private static final String USE_NEW_ID_GENERATOR_MAPPINGS = "hibernate.id."
                  + "new_generator_mappings";

          public Naming getNaming() {
              return this.naming;
          }
          ......省略
  }

  ......省略
  public static class Naming {

          private static final String DEFAULT_PHYSICAL_STRATEGY = "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy";

          private static final String DEFAULT_IMPLICIT_STRATEGY = "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy";

          /**
           * Fully qualified name of the physical naming strategy.
           */
          private String physicalStrategy;

          public void setPhysicalStrategy(String physicalStrategy) {
              this.physicalStrategy = physicalStrategy;
          }
          
          private void applyNamingStrategies(Map<String, String> properties) {
              applyNamingStrategy(properties, "hibernate.implicit_naming_strategy",
                    this.implicitStrategy, DEFAULT_IMPLICIT_STRATEGY);
              applyNamingStrategy(properties, "hibernate.physical_naming_strategy",
                    this.physicalStrategy, DEFAULT_PHYSICAL_STRATEGY);
          }

          private void applyNamingStrategy(Map<String, String> properties, String key,
                  String strategy, String defaultStrategy) {
              if (strategy != null) {
                  properties.put(key, strategy);
              }
              else if (defaultStrategy != null && !properties.containsKey(key)) {
                  properties.put(key, defaultStrategy);
              }
          }
          ......省略
  }
}
  • 通過(guò)連續(xù)的調(diào)用獲取到Naming對(duì)象,設(shè)置命名策略的屬性physicalStrategy就在此對(duì)象中涣易。
  • return jpaProperties.getHibernateProperties(dataSource);最后返回的這句中,最終會(huì)去調(diào)用applyNamingStrategies()此方法冶伞,我們?cè)谏弦徊揭呀?jīng)將strategy設(shè)置過(guò)了新症,在applyNamingStrategy()這個(gè)方法中會(huì)去判斷,它不為空响禽,就會(huì)將此put進(jìn)properties中去徒爹。如果我們不去配置這個(gè)策略荚醒,如源碼所示,它會(huì)設(shè)置默認(rèn)的命名策略隆嗅。

如有錯(cuò)誤界阁,歡迎指正。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胖喳,一起剝皮案震驚了整個(gè)濱河市泡躯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丽焊,老刑警劉巖较剃,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異技健,居然都是意外死亡写穴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門雌贱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)啊送,“玉大人,你說(shuō)我怎么就攤上這事欣孤∩鞠疲” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵导街,是天一觀的道長(zhǎng)披泪。 經(jīng)常有香客問(wèn)我,道長(zhǎng)搬瑰,這世上最難降的妖魔是什么款票? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮泽论,結(jié)果婚禮上艾少,老公的妹妹穿的比我還像新娘。我一直安慰自己翼悴,他們只是感情好缚够,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鹦赎,像睡著了一般谍椅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上古话,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天雏吭,我揣著相機(jī)與錄音,去河邊找鬼陪踩。 笑死杖们,一個(gè)胖子當(dāng)著我的面吹牛悉抵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摘完,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼姥饰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了孝治?” 一聲冷哼從身側(cè)響起列粪,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荆秦,沒(méi)想到半個(gè)月后篱竭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡步绸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年掺逼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓤介。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吕喘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刑桑,到底是詐尸還是另有隱情氯质,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布祠斧,位于F島的核電站闻察,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏琢锋。R本人自食惡果不足惜辕漂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吴超。 院中可真熱鬧钉嘹,春花似錦、人聲如沸鲸阻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鸟悴。三九已至陈辱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遣臼,已是汗流浹背性置。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揍堰,地道東北人鹏浅。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像屏歹,于是被迫代替她去往敵國(guó)和親隐砸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評(píng)論 6 342
  • 在我搭建基于Spring Cloud的微服務(wù)體系應(yīng)用的時(shí)候所需要或者是常用的屬性配置文件蝙眶,還有這些屬性的用途季希,此配...
    StrongManAlone閱讀 4,023評(píng)論 0 18
  • application的配置屬性。 這些屬性是否生效取決于對(duì)應(yīng)的組件是否聲明為Spring應(yīng)用程序上下文里的Bea...
    新簽名閱讀 5,370評(píng)論 1 27
  • 要加“m”說(shuō)明是MB幽纷,否則就是KB了. -Xms:初始值 -Xmx:最大值 -Xmn:最小值 java -Xms8...
    dadong0505閱讀 4,832評(píng)論 0 53
  • 趙意然和鄭紀(jì)寧認(rèn)識(shí)是在高中的時(shí)候式塌,沒(méi)有人可以說(shuō)清楚他們的喜歡誰(shuí)先誰(shuí)后。 高一的時(shí)候他們分別在兩個(gè)班友浸,趙意然性格開朗...
    愛(ài)哭鼻子的傻瓜閱讀 2,215評(píng)論 5 34