Странный классCastException hibernate 3.5 стеклянная рыба - PullRequest
6 голосов
/ 30 марта 2011

Привет, у меня есть проблема, которую я не могу решить самостоятельно.У меня есть файл war, упакованный в ухо и работающий на glassfish 3.0.1 с hibernate 3.5 в качестве поставщика JPA.Я компилирую его с помощью Maven и внедряю с идеей или вручную.Каждый раз, когда я получаю исключение приведения в моих DAO:

java.lang.ClassCastException: com.myproject.domain.entity.User cannot be cast to 
com.myproject.domain.entity.User

В других случаях все работает отлично.Там нет модели в этом поведении.Может ли кто-нибудь пролить свет на то, что здесь происходит?

Пример метода, в котором было сгенерировано исключение в com.myproject.domain.dao.UserDAOImpl.checkUserSessionValid (UserDAOImpl.java:195)

public User checkUserSessionValid(String sessionId) {
        User user = null;
        EntityManager em = provider.entityManager();

        try {
            em.getTransaction().begin();
           //Query q = em.createQuery("SELECT u FROM User u WHERE u.session.sessionId = :sessionId"); makes no difference :/
            Query q = em.createQuery("SELECT u FROM User u WHERE u.session.sessionId = :sessionId",User.class);
            q.setParameter("sessionId", sessionId);
            user = (User) q.getSingleResult();

            em.getTransaction().commit();
        } catch (NoResultException ignored) {

        } finally {
            em.close();
        }

        return user;
 }

My libraries
[INFO] +- org.apache.geronimo.specs:geronimo-jpa_2.0_spec:jar:1.0:provided
[INFO] +- javax.validation:validation-api:jar:1.0.0.GA:compile
[INFO] +- org.hibernate:hibernate-annotations:jar:3.5.1-Final:compile
[INFO] |  +- org.hibernate:hibernate-core:jar:3.5.1-Final:compile
[INFO] |  |  +- antlr:antlr:jar:2.7.6:compile
[INFO] |  |  +- commons-collections:commons-collections:jar:3.2.1:compile
[INFO] |  |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] |  |  \- javax.transaction:jta:jar:1.1:provided (scope managed from compile)
[INFO] |  +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile
[INFO] |  +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile
[INFO] |  \- org.slf4j:slf4j-api:jar:1.5.2:compile
[INFO] +- org.hibernate:hibernate-entitymanager:jar:3.5.1-Final:compile
[INFO] |  +- cglib:cglib:jar:2.2:compile
[INFO] |  |  \- asm:asm:jar:3.1:compile
[INFO] |  \- javassist:javassist:jar:3.9.0.GA:compile
[INFO] +- org.hibernate:hibernate-validator:jar:4.1.0.Final:compile
[INFO] +- org.slf4j:slf4j-simple:jar:1.5.2:test
[INFO] +- mysql:mysql-connector-java:jar:5.1.13:test
[INFO] +- org.hsqldb:hsqldb:jar:2.0.0:test

Ответы [ 3 ]

3 голосов
/ 24 февраля 2015

Для всех, кто приходит сюда через Google, эта проблема присутствует в 4.3.6 и выше: https://hibernate.atlassian.net/browse/HHH-9446

Переход на Hibernate 4.3.5 помог нам.

3 голосов
/ 30 марта 2011

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

В нашем случае мы смогли решить эту проблему, включив семантику передачи по значению, то есть при пересечении границы какого-либо загрузчика классов (или приложения) значения сериализуются / десериализуются. Может быть, вы можете проверить это и для Glassfish (и посмотреть, как там происходит загрузка классов).

Вы также можете проверить, есть ли у вас несколько копий или версий вашей библиотеки в пути к классам.

0 голосов
/ 07 июня 2014

Пожалуйста, проверьте Сгенерированные источники , если вы используете Netbeans или любую другую IDE.

Например, NetBeans сгенерирует в вашем случае класс User_ . Это будет сделано для любого другого класса в пакете com.myproject.domain.entity .

Проверьте каждый файл и удалите импорт из того же пакета. Не Очистите ваш проект, так как он сгенерирует код с операторами импорта из того же пакета. Просто Создайте снова и затем deploy .

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

import com.myproject.domain.entity.User;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...