Nano Hash - криптовалюты, майнинг, программирование

Проблема с загрузкой класса JPA в Hibernate

Когда я пытаюсь получить запись из своей базы данных, тип, возвращаемый из EntityManager, отличается от типа, указанного в моем коде. Они оба com.mycompany.Foo, но они были созданы с двумя разными загрузчиками классов. Я обнаружил, что загрузчик классов для второго типа имеет репозитории, установленные на WEB-INF/classes/ с jarPath, установленным на /WEB-INF/lib. Все это настроено с использованием JPA с Hibernate.

постоянство.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence
group 'testApplication'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'war'

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile 'javax:javaee-api:7.0'
    compile 'org.hibernate:hibernate-entitymanager:4.3.5.Final'
    compile 'org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.0.Final'
    compile 'mysql:mysql-connector-java:5.1.36'
}
0.xsd" version="2.0"> <persistence-unit name="manager1" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>devResource</jta-data-source> <validation-mode>CALLBACK</validation-mode> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" /> </properties> </persistence-unit> </persistence>

build.gradle с зависимостями:

group 'testApplication'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'war'

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile 'javax:javaee-api:7.0'
    compile 'org.hibernate:hibernate-entitymanager:4.3.5.Final'
    compile 'org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.0.Final'
    compile 'mysql:mysql-connector-java:5.1.36'
}

Класс, извлекающий сущность:

@Stateless
public class FooService {

    @PersistenceContext
    private EntityManager em;

    public Foo getFooEntity(final int id) {
        // Will throw a CastException since Foo is not Foo (loaded through different class loaders)
        return em.find(Foo.class, id);
    }
}

Я компилирую это с помощью IntelliJ (веб-приложение Exploded), может ли это быть проблемой с моими настройками развертывания? В настоящее время они определяются Gradle через военный плагин.


  • Это не вызвано JPA/Hibernate, поэтому они мало что могут с этим поделать. Это вызвано неправильной сборкой. Я совсем не знаком с Gradle, но вы говорите, что com.mycompany.Foo есть как в папке /WEB-INF/classes, так и в JAR в папке /WEB-INF/lib созданного файла WAR? 13.09.2015
  • Где вы это развертываете? Вы уверены, что банка, содержащая объекты, не находится в пути к классам сервера приложений? Кроме того, поскольку кажется, что вы используете EJB и, следовательно, сервер приложений с полным стеком, сервер приложений должен предоставлять все эти библиотеки, и, таким образом, они должны быть в конфигурации createdCompile или ProvideRuntime. 13.09.2015
  • Это развернуто на сервере приложений Glassfish. «Foo» не находится в папке «WEB-INF/lib», только загрузчик классов имеет jarPath, установленный в папку lib. Предоставленная компиляция и предоставленная среда выполнения - это то, что я могу установить в информации о сборке в IntelliJ, или это специфичная вещь для сервера приложений? Изменить: нет, это от Gradle. 13.09.2015

Ответы:


1

Проблема заключалась в том, что библиотеки, загружающие библиотеки, сканирующие аннотированные классы @Entity, не находятся в папке lib для моего домена. Перемещение зависимостей для моего проекта в эту папку устранило мою проблему.

13.09.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..