Использование ObjectDB с Spring Data JPA com.objectdb.jpa.EMF не является интерфейсом

Перецветы

Я пытаюсь получить ObjectDB (2.7.6_01, последняя версия) с Spring Data JPA (2.1.4, по-видимому, последняя).

В документах для Spring Data JPA говорится, что необходим поставщик JPA версии 2.1. Поставщик JPA AFAIKT ObjectDB - 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 CGLIB вокруг этого класса (EMF) не работает.

У кого-нибудь есть идеи?

Зависимости Gradle:

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;
}

Or

@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.* вообще не установлен.

Ваше здоровье


person RichColours    schedule 26.01.2019    source источник
comment
Я не знаю полного ответа на ваш вопрос, но могу предположить. Исключение, которое вы видите, это то, что выдает java.lang.Proxy.getProxyClass, когда вы передаете ему класс вместо интерфейса. Я думаю, что вы каким-то образом настраиваете Spring с помощью класса реализации ObjectDB EntityManagerFactory, и Spring пытается создать для этого прокси. В сообщении об ошибке предлагается указать Spring вместо этого проксировать интерфейс EntityManagerFactory.   -  person Willis Blackburn    schedule 26.01.2019
comment
Привет, Уиллис - я зашел так далеко с расшифровкой сообщения об ошибке. Но я еще не знаю, предназначен ли какой-либо поставщик EntityManagerFactory для интерфейса или нет. В конечном счете, это должен быть класс, иначе он ничего не сделает.   -  person RichColours    schedule 27.01.2019
comment
Также я нашел, как изменить этот интерфейс, как предлагает одно из исключений.   -  person RichColours    schedule 27.01.2019
comment
Попробуйте следовать инструкциям на objectdb.com/forum/2328 или опубликуйте полный тест. случай, который не подлежит дальнейшему рассмотрению.   -  person ObjectDB    schedule 31.01.2019
comment
Спасибо за это, я перепробовал почти все из этого поста на форуме, включая bean-компонент JpaVendorAdapter и т. Д. Дайте мне несколько дней, я опубликую git-репозиторий полной, неработающей установки.   -  person RichColours    schedule 01.02.2019


Ответы (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).

Простой рабочий пример можно найти здесь.

person Amir Kirsh    schedule 09.01.2020