2017-06-01 59 views
0

獲得此配置的任何幫助都是值得歡迎的。Spring Boot voodoo需要使用DataNucleus和Hikari實例化JPA

我想從Spring Boot接管自動連接池,數據源和JPA配置,以允許我將DataNucleus加入混合而不是Hibernate

我的方法是代碼片斷Boot說在試驗和錯誤的基礎上失蹤。我不得不刪除Hibernate的依賴關係以允許DataNucleus運行。

也許我現在編碼了太多,或許我不夠遠。

春翻倒出現錯誤:

Exception encountered during context initialization - cancelling refresh attempt: 
[huge SNIP] 
nested exception is org.springframework.beans.BeanInstantiationException: 
    Failed to instantiate [org.springframework.data.repository.support.Repositories]: 
    Factory method 'repositories' threw exception; 
nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: 
    Error creating bean with name 'symbolRepositoryImpl': 
    Unsatisfied dependency expressed through field 'entityManager'; 
nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
    No qualifying bean of type 'javax.persistence.EntityManager' available: 
    expected single matching bean but found 2: 
    org.springframework.orm.jpa.SharedEntityManagerCreator#0, 
    org.springframework.orm.jpa.SharedEntityManagerCreator#1 
[SNIP] 
2017-06-01 09:43:09.675 ERROR 9108 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter 

*************************** 
APPLICATION FAILED TO START 
*************************** 

Description: 

Field entityManager in com.bp.gis.tardis.repository.SymbolRepositoryImpl 
    required a single bean, but 2 were found: 
    - org.springframework.orm.jpa.SharedEntityManagerCreator#0: defined by method 'createSharedEntityManager' in null 
    - org.springframework.orm.jpa.SharedEntityManagerCreator#1: defined by method 'createSharedEntityManager' in null 


Action: 

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, 
or using @Qualifier to identify the bean that should be consumed 

我可以花時間調試這個進一步,但斷點進來裏面應該有一個EntityManager注入的庫之一的初始化。

這就是我手動實例:

@Configuration 
@EnableJpaRepositories(
     basePackages = {"org.adam.repository"} 
) 
public class DataSourceConfig { 


    @Bean 
    @ConfigurationProperties(prefix = "adam.datasource") 
    public AdamDataSourceProperties getDataSourceProperties() { 
     return new AdamDataSourceProperties(); 
    } 

    @Bean 
    public DataSource getDataSource() { 
     AdamDataSourceProperties props = getDataSourceProperties(); 
     return new HikariDataSource(props.getHikariConfig()); 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean getEmfBean() { 
     LocalContainerEntityManagerFactoryBean emfBean = 
       new LocalContainerEntityManagerFactoryBean(); 
     emfBean.setDataSource(getDataSource()); 
     emfBean.setPersistenceUnitName("adam"); 
     return emfBean; 
    } 

    @Bean 
    public EntityManagerFactory getEmf() { 
     LocalContainerEntityManagerFactoryBean emfBean = getEmfBean(); 
     return emfBean.getNativeEntityManagerFactory(); 
    } 

} 

AdamDatasourceProperties被Spring使用「adam.datasource」初始化前綴值application.properties,然後它可以創建一個HikariConfig對象使用實例HikariDataSource。這一點實際上很好,它可能是造成問題的實體管理器工廠 - 或其他。

我沒有證據表明我最後的方法getEmf()實際上有幫助。

而且,我懷疑是錯誤

Required a single bean, but 2 were found

或建議的行動是有益的 - 我不喜歡進入春季的源代碼,以註釋的那些方法之一Spring的SharedEntityManagerCreator@Primary

更新,如果發現在類路徑上其他JPA API類 DataNucleus將不會運行 - 它堅持它自己版本的持久性API的 - 因此消除了Hibernate的包裝是必要的。

Caused by: org.datanucleus.exceptions.NucleusUserException: 
    Found Meta-Data for class org.adam.entity.TimeSeriesEntity 
    but this class is either not enhanced or you have multiple copies 
    of the persistence API jar in your CLASSPATH!! 
    Make sure all persistable classes are enhanced before running 
    DataNucleus and/or the CLASSPATH is correct. 
    at org.datanucleus.metadata.MetaDataManagerImpl 
      .initialiseClassMetaData(MetaDataManagerImpl.java:2814) 

所以我已經從spring-boot-starter-data-jpa排除休眠,錯誤消失。

+1

不知道所有那些Spring的東西,但沒有LocalContainerEntityManagerFactoryBean.setPersistenceProviderClass定義您的JPA提供程序,因此也許您不必從CLASSPATH中排除其他提供程序?畢竟,DataNucleus完全遵從JPA規範中的「提供者」。 –

+0

什麼是「它堅持自己的持久化API版本」?你在這裏沒有任何版本的東西。我沒有在他們的「API jar」中看到任何不在JPA 2.1規範中的東西。顯然,JPA專家組不會發布標準的JPA API,因此提供者都創建了自己的API jar。 –

+0

@NeilStockton DataNucleus不必擁有一個persistence.xml,是嗎? – Adam

回答

1

我改變了LocalContainerEntityManagerFactoryBean方法名entityManagerFactory

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean emfBean = 
      new LocalContainerEntityManagerFactoryBean(); 
    emfBean.setDataSource(getDataSource()); 
    emfBean.setPersistenceUnitName("adam"); 
    return emfBean; 
} 

並啓用測試,我要複製此@Configuration類,並改變EMF的方法來接受Spring的測試數據庫:

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
     @Qualifier("dataSource") DataSource dataSource) { 
    LocalContainerEntityManagerFactoryBean emfBean = 
      new LocalContainerEntityManagerFactoryBean(); 
    emfBean.setDataSource(dataSource); 
    emfBean.setPersistenceUnitName("adam"); 
    return emfBean; 
} 

@Qualifier是爲了Intellij的緣故,他的Spring方面在這裏投訴了2名注射候選人。

我還發現使用此配置,EntityManager的存儲庫/ DTO依賴項注入不適用於@Autowired。它是原生的JPA註釋:

@PersistenceContext 
private EntityManager entityManager; 

與我以前Hibernate和OpenJPA的配置,春高興地注入其自身實例化在@Autowire存在EntityManager

這增加了我的牛肉與春天的燃料。它往往不會做它在罐子上所說的。春季測試應該在軟件包層次結構中找到@Configuration類,但不會 - 我需要使用@Import。 Spring還應該根據類型(EntityManagerDataSource等)找到依賴注入候選項,但它不會 - 在某些情況下,它們必須由名爲特定名稱的方法或使用聲明名稱的註釋生成。

不過,它完成了。

相關問題