嗨,我有一个问题,我无法自己解决。 我有一个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
答案 0 :(得分:3)
好吧,我们有时会使用JBoss发生类似的错误。问题是有一个类加载器(类加载器存储库)问题。当您有多个类加载器加载相同的类时,您可以获得该异常,因为加载器1加载的类和加载器2加载的类不相同。
在我们的例子中,我们能够通过启用按值传递语义来解决这个问题,即每当跨越某个类加载器(或app)边界时,值就被序列化/反序列化。也许你也可以检查Glassfish(并查看如何在那里完成类加载)。
您还可以检查类路径中是否有多个副本或版本的库。
答案 1 :(得分:3)
对于通过谷歌来到这里的所有人来说,4.3.6及更高版本中存在此问题:https://hibernate.atlassian.net/browse/HHH-9446
降级到Hibernate 4.3.5为我们的团队做了诀窍。
答案 2 :(得分:0)
如果您使用的是Netbeans或任何其他IDE,请检查生成的来源。
例如 NetBeans 会在您的情况下生成 User _ 类。它将在 com.myproject.domain.entity 包中为每个其他类执行此操作。
检查每个文件并从同一个包中删除导入。不要清理您的项目,因为它将使用同一个包中的import语句重新生成代码。只需再次构建,然后部署。
为了确保,请检查所有类以获取以下语句(或等效语句),如果导入来自同一个包,则删除:
import com.myproject.domain.entity.User;