OpenJPA & Spring Boot 2 & Gradle - PullRequest
3 голосов
/ 10 мая 2019

Я пытаюсь запустить OpenJPA с новейшими Spring Boot 2 и Gradle.

Проблема в том, что Spring 5 больше не поддерживает OpenJPA.

Когда я запускаю приложение, я вижу ошибку:

Caused by: org.apache.openjpa.persistence.ArgumentException: This configuration disallows runtime optimization, but the following listed types were not enhanced at build time or at class load time with a javaagent: "
aero.onair.accground.aft.TestEntity".

Был какой-то плагин для более старой версии Gradle, который улучшал сущность с помощью библиотеки openjpa, но он не работает с более новой.

Я использовал адаптер и диалект, как в этом репо: https://github.com/apache/syncope/tree/master/core/persistence-jpa/src/main/java/org/springframework/orm/jpa/vendor

У меня есть файл persistence.xml в ресурсах / jpa / persistence.xml Я также пытался переместить его в ресурсы / META-INF /

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
  version="2.0">

  <persistence-unit name="aftDbUnitName">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <class>aero.onair.accground.aft.TestEntity</class>
  </persistence-unit>

</persistence>

Моя конфигурация для OpenJPA:

import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.openjpa.persistence.PersistenceProviderImpl;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter;
import org.springframework.transaction.jta.JtaTransactionManager;

@Configuration
public class OpenJpaConfig extends JpaBaseConfiguration {

  protected OpenJpaConfig(DataSource dataSource,
      JpaProperties properties,
      ObjectProvider<JtaTransactionManager> jtaTransactionManager,
      ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
    super(dataSource, properties, jtaTransactionManager, transactionManagerCustomizers);
  }

  @Override
  protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
    OpenJpaVendorAdapter jpaVendorAdapter = new OpenJpaVendorAdapter();
    jpaVendorAdapter.setShowSql(true);
    return jpaVendorAdapter;
  }
  @Override
  protected Map<String, Object> getVendorProperties() {
    return new HashMap<>(0);
  }

  @Bean
  public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setDataSource(getDataSource());
    factory.setPersistenceProviderClass(PersistenceProviderImpl.class);
    factory.setJpaVendorAdapter(new OpenJpaVendorAdapter());
    factory.setPersistenceXmlLocation("jpa/persistence.xml");
    return factory;
  }
}

Тестовый объект:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class TestEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  private String name;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

И, наконец, основной класс приложения:

@SpringBootApplication(exclude = {XADataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@Slf4j
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Autowired
  TestEntitiyRepository testEntitiyRepository;

  @PostConstruct
  public void test() {
    long count = testEntitiyRepository.count();
    log.info("Count = {}", count);

    TestEntity entitiy = new TestEntity();
    entitiy.setName("testtttt");

    testEntitiyRepository.save(entitiy);

    count = testEntitiyRepository.count();
    log.info("Count after save = {}", count);
  }
}

1 Ответ

1 голос
/ 10 мая 2019

Лучшим решением для меня было добавить плагин с этой страницы:

https://github.com/radcortez/openjpa-gradle-plugin

Другое решение - установить javaagent в параметрах виртуальной машины: -javaagent: / path / openjpa-все-3.1.0.jar

...