1

溢出者

我正在尝试使用 Spring Data JPA(2.1.4,看似最新)获取 ObjectDB(2.7.6_01,最新)。

Spring Data JPA 的文档说需要 2.1 版 JPA 提供程序。AFAIKT ObjectDB 的 JPA 提供程序是 2.0 ...不确定这是否是问题所在。

但我的问题是这个例外:

Caused by: java.lang.IllegalArgumentException: com.objectdb.jpa.EMF is not an interface

这导致:

EntityManagerFactory interface [class com.objectdb.jpa.EMF] seems to conflict with Spring's EntityManagerFactoryInfo mixin - consider resetting the 'entityManagerFactoryInterface' property to plain [javax.persistence.EntityManagerFactory]

我很高兴我的代码正确地选择了 ObjectDB 实体管理器工厂,但是 Spring 围绕此类 (EMF) 的 CGLIB 包装器无法正常工作。

有人有什么想法吗?

摇篮依赖:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compile files('libs/objectdb-jee.jar')
    compileOnly 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

然后,这两个 @Bean 中的任何一个(一个或另一个,而不是两者)都会导致上述相同的 EMF 异常:

@Bean
public JpaVendorAdapter jpaVendorAdapter() {

    final ObjectdbJpaVendorAdapter vendorAdapter = new ObjectdbJpaVendorAdapter();

    return vendorAdapter;
}

或者

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

    final ObjectdbJpaVendorAdapter vendorAdapter = new ObjectdbJpaVendorAdapter();

    vendorAdapter.setShowSql(true);
    vendorAdapter.setGenerateDdl(false);

    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter(vendorAdapter);

    factory.setPackagesToScan("com.example.demo.persistence");
    factory.setDataSource(dataSource());
    factory.afterPropertiesSet();

    return factory;
}

我有一个无操作的 DataSource @Bean 来保持 Spring 的某些方面快乐,但我认为它在这个问题中没有发挥积极作用。

根本没有设置 spring.jpa.*。

干杯

4

1 回答 1

1

您必须提供的Beans内容要简单得多:

@Bean
@ConfigurationProperties("app.datasource")
public DataSource dataSource() {
   return DataSourceBuilder.create().build();
}

@Bean(name="entityManagerFactory")
public EntityManagerFactory getEntityManagerFactoryBean() {
   // this is the important part - here we use a local objectdb file
   // but you can provide connection string to a remote objectdb server
   // in the same way you create objectdb EntityManagerFactory not in Spring
   return Persistence.createEntityManagerFactory("spring-data-jpa-test.odb");
}

@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
   JpaTransactionManager txManager = new JpaTransactionManager();
   txManager.setEntityManagerFactory(emf);
   return txManager;
}

有了上面的(和你的正确依赖pom.xml),就不需要任何额外的配置(即在 application.properties 中不需要任何配置)。

可以在此处找到一个简单的工作示例。

于 2020-01-09T19:48:51.217 回答