Как статически соткать сущности JPA, используя EclipseLink, когда нет persistence.xml, поскольку сущности управляются Spring - PullRequest
6 голосов
/ 14 марта 2019

У меня есть проект, основанный на Spring, поэтому менеджер сущностей настроен программно, без необходимости в файлах persistence.xml для перечисления всех сущностей.

В настоящее время я использую время загрузкиткачество, но я пытаюсь заставить работать статическое плетение, используя Eclipselink и Gradle.Я хочу воспроизвести то, что выполняет плагин maven eclipselink:

https://github.com/ethlo/eclipselink-maven-plugin

У меня настроен следующий gradle (обратите внимание, что это Kotlin DSL, а не groovy):

task<JavaExec>("performJPAWeaving") {


    val compileJava: JavaCompile = tasks.getByName("compileJava") as JavaCompile
    dependsOn(compileJava)

    val destinationDir = compileJava.destinationDir

    println("Statically weaving classes in $destinationDir")
    inputs.dir(destinationDir)
    outputs.dir(destinationDir)
    main = "org.eclipse.persistence.tools.weaving.jpa.StaticWeave"
    args = listOf("-persistenceinfo", "src/main/resources", destinationDir.getAbsolutePath(), destinationDir.getAbsolutePath())

    classpath = configurations.getByName("compile")


}

Когда я пытаюсь запустить задачу, задачи плетения не выполняются, так как она ищет несуществующий файл persistence.xml.

Есть ли способ статического переплетения сущностей JPA в проекте JPA на основе Spring?

Exception Description: An exception was thrown while processing persistence.xml from URL: file:/home/blabla/trunk/my-module/src/main/resources/
Internal Exception: java.net.MalformedURLException
        at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionProcessingPersistenceXML(PersistenceUnitLoadingException.java:117)
        at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceXML(PersistenceUnitProcessor.java:579)
        at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceArchive(PersistenceUnitProcessor.java:536)
        ... 6 more
Caused by: java.net.MalformedURLException
        at java.net.URL.<init>(URL.java:627)
        at java.net.URL.<init>(URL.java:490)
        at java.net.URL.<init>(URL.java:439)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:620)
        at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:148)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:806)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
        at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceXML(PersistenceUnitProcessor.java:577)
        ... 7 more
Caused by: java.lang.NullPointerException
        at java.net.URL.<init>(URL.java:532)
        ... 17 more

Ответы [ 2 ]

1 голос
/ 25 июля 2019

Я прочитал существующую документацию из:

org.eclipse.persistence.tools.weaving.jpa.StaticWeave

Использование:
StaticWeave [опции] исходная цель

Опции:
-classpath Установите путь к классу пользователя, используйте «;» в качестве разделителя в оконной системе и ":" в системе Unix.

-log Путь к файлу журнала, стандартный вывод будет по умолчанию.

-loglevel Укажите буквенное значение для уровня журнала eclipselink (OFF, SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST). По умолчанию значение ВЫКЛ.

-persistenceinfo Путь содержит META-INF / persistence.xml. Это ТОЛЬКО требуется, когда источник не включает его. Путь к классу должен содержать все классы, необходимые для выполнения ткачества.

После просмотра инструкций по использованию, мне кажется, этот класс требует persistence.xml для генерации статических источников ткачества.

Я также протестировал плагин eclipselink maven, и он работал без persistence.xml, как вы упомянули, потому что он генерирует persistence.xml перед вызовом StaticWeave.class, если он не находится в CLASSPATH, используя этот метод.

 private void processPersistenceXml(ClassLoader classLoader, Set<String> entityClasses)
    {
        final File targetFile = new File(this.persistenceInfoLocation + "/META-INF/persistence.xml");
        getLog().info("persistence.xml location: " + targetFile);

        final String name = project.getArtifactId();
        final Document doc = targetFile.exists() ? PersistenceXmlHelper.parseXml(targetFile) : PersistenceXmlHelper.createXml(name);

        checkExisting(targetFile, classLoader, doc, entityClasses);

        PersistenceXmlHelper.appendClasses(doc, entityClasses);
        PersistenceXmlHelper.outputXml(doc, targetFile);
    }

Полный исходный код здесь

Я думаю, вы могли бы использовать тот же подход в вашей gradle build.

0 голосов
/ 25 июля 2019

Признаюсь, я не совсем понимаю, что вы подразумеваете под плетением.Мой ответ может помочь, если вам нужно динамически создавать PersistenceUnits, которые предоставляют JPA-Entitymanagers, и если эти модули должны иметь возможность создавать Db-схему (например, в H2) и управлять объектами динамически на основе классов, которые вы предоставляете во время выполнения.

Пример кода, о котором я упомяну позже, не работает с JPA в Spring, но в Weld.Я думаю, что ответ на ваш вопрос связан с тем, как создаются EntityManager и какими классами управляет PersistenceUnit, который создает EntityManager.Там нет никакой разницы между этими двумя.Вместо использования EntityManagerFactory в качестве CDI-Producer вы можете автоматически подключить его или зарегистрировать, используя устаревший контекст приложения.Поэтому я думаю, что ответ на ваш вопрос заключается в следующих официальных источниках :

PersistenceProviderResolverHolder и PersistenceProvider # createEntityManagerFactory (getPersistenceUnitName (), properties) properties является заменой для файла persistence.xml, в котором можно зарегистрировать объект SEPersistenceUnitInfo.

Для начала рассмотрим: PersistenceProviderResolverHolder Позже: PersistenceProvider

или вы можете попытаться понять, как мой код (см. Ниже) делает это.Но я должен признать, что я не очень горжусь этой частью этого программного обеспечения, извините.

Эти классы и объекты используются мной для создания модуля, который позволяет моделировать развернутый сервер JPA-WAR-Файл.Для этого он сканирует некоторые классы и идентифицирует сущности.Позже в Testcode так называемая PersistenceFactory создает EntityManager и Datasources.Если используется eclipselink, эта фабрика объединяет эти классы вместе.Вам не нужен файл persistence.xml.Работа там может помочь ответить на ваш вопрос.

Если вы посмотрите на: ioc-unit-ejb: TestPersistencefactory поиск для создания SEPersistenceUnitInfo.Этот интерфейс получает список классов, которые он возвращает как

@Override
public List<String> getManagedClassNames() {
    return TestPersistenceFactory.this.getManagedClassNames();
}

Этот объект используется для создания фабрики постоянства с помощью PersistenceProvider.Это можно обнаружить, как только eclipselink станет доступен в classpath.

Код не так прост для понимания, так как он позволяет использовать как Hibernate, так и Eclipselink для JPA, что зависит от доступности jar-файлов впуть к классам.

...