2017-03-09 80 views
3

我使用Spring Data,並決定創建可以在Hibernate實體中使用的新自定義數據類型。我檢查了文檔並選擇BasicType並根據此official user guide實施它。使用Spring Data時應該如何註冊自定義Hibernate 5數據類型(BasicType)?

我希望能夠在其類名下注冊類型,並且能夠在實體中使用新類型,而不需要註解@Type。不幸的是,我無法參照MetadataBuilder或Hibernate配置來註冊新類型。有沒有辦法如何在Spring Data中獲得它?看起來,Hibernate的初始化對用戶來說是隱藏的,不容易被訪問。我們用下面的類來初始化JPA:

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(
     entityManagerFactoryRef = "entityManagerFactory", 
     transactionManagerRef = "transactionManager", 
     basePackages = { 
       "..." // omitted 
     } 
) 
public class JpaConfiguration implements TransactionManagementConfigurer { 

    @Primary 
    @Bean(name = "entityManagerFactory") 
    public LocalContainerEntityManagerFactoryBean configureEntityManagerFactory(
     DataSource dataSource, 
     SchemaPerTenantConnectionProviderImpl provider) { 

     LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setPersistenceUnitName("defaultPersistenceUnit"); 
     entityManagerFactoryBean.setDataSource(dataSource); 
     entityManagerFactoryBean.setPackagesToScan(
       "..." // omitted 
     ); 
     entityManagerFactoryBean.setJpaProperties(properties(provider)); 
     entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 
     return entityManagerFactoryBean; 
    } 

    @Primary 
    @Bean(name = "transactionManager") 
    public PlatformTransactionManager annotationDrivenTransactionManager() { 
     return new JpaTransactionManager(); 
    } 

    private Properties properties(SchemaPerTenantConnectionProviderImpl provider) { 
     Properties properties = new Properties(); 
     // omitted 
     return properties; 
    } 
} 

我發現了大量的有關辦法如何與Hibernate的配置對象做的文章,但這個指的是Hibernate的3和4。我還發現方式如何通過做休眠org.hibernate.integrator.spi.Integrator但當我根據我發現的文章使用它時,我將得到異常與消息「org.hibernate.HibernateException:無法在此時更改TypeRegistry」 什麼是在Spring數據中註冊自定義類型的正確方法?

回答

5

我終於明白了。我會在這裏發佈給其他人:

我創建了一個實現org.hibernate.boot.spi.SessionFactoryBuilderFactory接口的新類。在這個類中,我可以從元數據中獲得對TypeResolver的引用並註冊我的自定義類型。

src/main/resources/META-INF/services/org.hibernate.boot.spi.SessionFactoryBuilderFactory 

該文件可以包含多個:

package com.example.configuration; 

import org.hibernate.boot.SessionFactoryBuilder; 
import org.hibernate.boot.spi.MetadataImplementor; 
import org.hibernate.boot.spi.SessionFactoryBuilderFactory; 
import org.hibernate.boot.spi.SessionFactoryBuilderImplementor; 
import org.slf4j.LoggerFactory; 

import com.example.CustomType; 

public class CustomDataTypesRegistration implements SessionFactoryBuilderFactory { 

    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(CustomDataTypesRegistration.class); 

    @Override 
    public SessionFactoryBuilder getSessionFactoryBuilder(final MetadataImplementor metadata, final SessionFactoryBuilderImplementor defaultBuilder) { 
     logger.info("Registering custom Hibernate data types"); 
     metadata.getTypeResolver().registerTypeOverride(CustomType.INSTANCE); 
     return defaultBuilder; 
    } 
} 

的類必須然後通過Java ServiceLoader mechanism加入全名,其包中的類到文件名稱爲org.hibernate.boot.spi.SessionFactoryBuilderFactory到Java模塊META-INF/services目錄中註冊每行都引用不同的類。在這種情況下,它是:

com.example.configuration.CustomDataTypesRegistration 

這樣的春天開始的數據和自定義類型Hibernate的初始化過程中成功註冊。

對我來說很有幫助的是這個SO answer在Spring Data下處理Hibernate 5中的模式導出。

+1

花了大約20秒的時間詢問和回答,我想「*我終於明白了*」是一個笑話,對吧? ; P – Mistalis

+0

我昨天寫了這個問題,但沒有發佈。今天我明白了。我決定發佈與其他人會遇到同樣問題的答案。對我來說,這個職位之前有延遲;) – xMort

相關問題