您好,登錄后才能下訂單哦!
本篇內容介紹了“JPA和Spring中Hibernate怎么初始化和獲得數據源”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
通過調試,我們發現是 spring啟動中,hibernate會裝載和初始化 全局配置, 其實就是個 Map。
在Map中 他會初始化 org.hibernate.cfg.AvailableSettings#DATASOURCE 的key 作為 map里數據源的key。
數據源初始化代碼 位于 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl#normalizeDataAccess :
private void normalizeDataAccess( HashMap<?, ?> integrationSettingsCopy, MergedSettings mergedSettings, PersistenceUnitDescriptor persistenceUnit) { if ( dataSource != null ) { applyDataSource( dataSource, // we don't explicitly know null, integrationSettingsCopy, mergedSettings ); // EARLY EXIT!! return; } if ( integrationSettingsCopy.containsKey( DATASOURCE ) ) { final Object dataSourceRef = integrationSettingsCopy.remove( DATASOURCE ); if ( dataSourceRef != null ) { applyDataSource( dataSourceRef, null, integrationSettingsCopy, mergedSettings ); // EARLY EXIT!! return; } } if ( integrationSettingsCopy.containsKey( JPA_JTA_DATASOURCE ) ) { final Object dataSourceRef = integrationSettingsCopy.remove( JPA_JTA_DATASOURCE ); if ( dataSourceRef != null ) { applyDataSource( dataSourceRef, true, integrationSettingsCopy, mergedSettings ); // EARLY EXIT!! return; } } if ( integrationSettingsCopy.containsKey( JPA_NON_JTA_DATASOURCE ) ) { final Object dataSourceRef = integrationSettingsCopy.remove( JPA_NON_JTA_DATASOURCE ); applyDataSource( dataSourceRef, false, integrationSettingsCopy, mergedSettings ); // EARLY EXIT!! return; } if ( integrationSettingsCopy.containsKey( URL ) ) { // these have precedence over the JPA ones final Object integrationJdbcUrl = integrationSettingsCopy.get( URL ); if ( integrationJdbcUrl != null ) { //noinspection unchecked applyJdbcSettings( integrationJdbcUrl, NullnessHelper.coalesceSuppliedValues( () -> ConfigurationHelper.getString( DRIVER, integrationSettingsCopy ), () -> ConfigurationHelper.getString( JPA_JDBC_DRIVER, integrationSettingsCopy ), () -> ConfigurationHelper.getString( DRIVER, mergedSettings.configurationValues ), () -> ConfigurationHelper.getString( JPA_JDBC_DRIVER, mergedSettings.configurationValues ) ), integrationSettingsCopy, mergedSettings ); // EARLY EXIT!! return; } } if ( integrationSettingsCopy.containsKey( JPA_JDBC_URL ) ) { final Object integrationJdbcUrl = integrationSettingsCopy.get( JPA_JDBC_URL ); if ( integrationJdbcUrl != null ) { //noinspection unchecked applyJdbcSettings( integrationJdbcUrl, NullnessHelper.coalesceSuppliedValues( () -> ConfigurationHelper.getString( JPA_JDBC_DRIVER, integrationSettingsCopy ), () -> ConfigurationHelper.getString( JPA_JDBC_DRIVER, mergedSettings.configurationValues ) ), integrationSettingsCopy, mergedSettings ); // EARLY EXIT!! return; } } if ( persistenceUnit.getJtaDataSource() != null ) { applyDataSource( persistenceUnit.getJtaDataSource(), true, integrationSettingsCopy, mergedSettings ); // EARLY EXIT!! return; } if ( persistenceUnit.getNonJtaDataSource() != null ) { applyDataSource( persistenceUnit.getNonJtaDataSource(), false, integrationSettingsCopy, mergedSettings ); // EARLY EXIT!! return; } if ( mergedSettings.configurationValues.containsKey( URL ) ) { final Object url = mergedSettings.configurationValues.get( URL ); if ( url != null && ( ! ( url instanceof String ) || StringHelper.isNotEmpty( (String) url ) ) ) { applyJdbcSettings( url, ConfigurationHelper.getString( DRIVER, mergedSettings.configurationValues ), integrationSettingsCopy, mergedSettings ); // EARLY EXIT!! return; } } if ( mergedSettings.configurationValues.containsKey( JPA_JDBC_URL ) ) { final Object url = mergedSettings.configurationValues.get( JPA_JDBC_URL ); if ( url != null && ( ! ( url instanceof String ) || StringHelper.isNotEmpty( (String) url ) ) ) { applyJdbcSettings( url, ConfigurationHelper.getString( JPA_JDBC_DRIVER, mergedSettings.configurationValues ), integrationSettingsCopy, mergedSettings ); // EARLY EXIT!! return; } } // any other conditions to account for? }
通過代碼可以看出 他會優先幾個 key,看是否已經有了,有就沿用這些key里的數據源。
我的項目目前都沒有,代碼往下走,到了
if ( persistenceUnit.getNonJtaDataSource() != null ) { 這一行, 發現在 org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor#getNonJtaDataSource 獲取了數據源:
轉而調用了 javax.persistence.spi.PersistenceUnitInfo#getNonJtaDataSource :
發現真正的實現類是:org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo 的 getNonJtaDataSource 方法。
然后最終調用了 : org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo#getNonJtaDataSource 這個方法返回了 這個類的實例變量
org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo#nonJtaDataSource , 所以我們繼續看 實例變量是如何初始化的:
最終發現 是 org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration 初始化的, 而他是由 org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration 導入的。
然后發現 最后DataSource來自于 spring boot autoconfig包的 org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration 類,
HibernateJpaConfiguration 直接繼承的他, 默認的DataSource對象也是 JpaBaseConfiguration 實例字段。
org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration#dataSource 而這個字段則是直接通過 類構造方法 讓spring自動ioc的。
“JPA和Spring中Hibernate怎么初始化和獲得數據源”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。