过花
我正在尝试使用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。*。
欢呼
答案 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。