6

嗨,我有一个我自己无法解决的问题。我有一个打包在 ear 中的 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
4

3 回答 3

3

对于通过谷歌来到这里的所有人,这个问题出现在 4.3.6 及更高版本中:https ://hibernate.atlassian.net/browse/HHH-9446

降级到 Hibernate 4.3.5 为我们的团队解决了问题。

于 2015-02-24T09:25:22.117 回答
3

嗯,我们有时在使用 JBoss 时会遇到类似的错误。问题有一个类加载器(类加载器存储库)问题。当多个类加载器加载同一个类时,您会得到该异常,因为加载器 1 加载的类和加载器 2 加载的类不相同。

在我们的例子中,我们能够通过启用按值传递语义来解决这个问题,即每当某个类加载器(或应用程序)边界被越过时,值就会被序列化/反序列化。也许您也可以检查 Glassfish(并查看那里的类加载方式)。

您还可以检查类路径中是否有库的多个副本或版本。

于 2011-03-30T08:05:03.747 回答
0

如果您使用的是 Netbeans 或任何其他 IDE,请检查您的生成源。

例如, NetBeans将在您的情况下生成一个User_类。它也适用于com.myproject.domain.entity包中的所有其他类。

检查每个文件并从同一个包中删除导入。不要清理您的项目,因为它会使用同一包中的导入语句重新生成代码。只需再次构建,然后部署.

可以肯定的是,检查所有类中是否有以下语句(或等效语句),如果导入来自同一个包,则删除:

import com.myproject.domain.entity.User;

于 2014-06-07T01:36:03.643 回答