将ObjectDB与Spring Data JPA结合使用“ com.objectdb.jpa.EMF不是接口”

时间:2019-01-26 14:11:42

标签: spring jpa objectdb

过花

我正在尝试使用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'
}

然后,这两个@Beans中的一个(一个或另一个,不是两个)导致上述相同的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;
}

我有一个No-op DataSource @Bean可以使Spring开心一些,但我认为它在此问题中没有发挥积极作用。

完全没有设置spring.jpa。*。

欢呼

1 个答案:

答案 0 :(得分: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中不需要任何配置)。

可以找到一个简单的工作示例here