这段代码让我感到恼火, 有时候它会起作用,有时则不起作用!
NamedQuery :( name =“User.findByLogin”,query =“SELECT u FROM User u WHERE u.login =:login“)
public User findByLogin(String login) {
Query query = em.createNamedQuery("User.findByLogin");
query.setParameter("login", login);
try {
return (User) query.getSingleResult();
} catch (javax.persistence.NoResultException ex) {
return null;
}
}
错误让我发疯!
Avertissement:EJB5184:在EJB UserFacade上调用期间发生系统异常,方法:public dz.admin.entity.User dz.admin.service.UserFacade.findByLogin(java.lang.String ) Avertissement:javax.ejb.EJBException ....的产生的原因:java.lang.ClassCastException:dz.elit.admin.entity.User不能在dz.elit.admin.service投射到dz.elit.admin.entity.User .UserFacade.findByLogin(UserFacade.java:45)
答案 0 :(得分:5)
我的猜测是你有不同的类加载器。 JVM仍然认为在不同的类加载器中加载的同一个类是不同的。
要验证这一点,您可以尝试捕获异常并打印/记录类加载器。
public User findByLogin(String login) {
Query query = em.createNamedQuery("User.findByLogin");
query.setParameter("login", login);
Object result = null;
try {
result = query.getSingleResult();
return (User) result ;
} catch (javax.persistence.NoResultException ex) {
return null;
} catch (ClassCastException ex) {
logger.info("Object classloader: " + result.getClass().getClassLoader());
logger.info("Target class classloader: " + User.class.getClassLoader());
if(result.getClass().getClassLoader() != User.class.getClassLoader()) {
logger.warn("Different classloaders detected!");
}
}
}
至于解决方案,当然这取决于你的其他设置......为了让你开始,我可以给你一些指向之前提出的相关问题的指示。也许那里的一些答案对你有帮助:
一些建议的解决方案包括更改类加载器设置,使用通用界面或序列化/反序列化对象。
答案 1 :(得分:0)
Query query = em.createNamedQuery("User.findByLogin");
...
return (User) query.getSingleResult();
您可能需要检查用户是否确实存在(非空)。 有时它会为null,你需要重新引用它
有时它会起作用,有时则不起作用!
答案 2 :(得分:0)
我在 spring-boot 应用程序中遇到相同的问题,并浪费了很多时间来解决它。
问题是由于类加载器而产生的。
Model类和Session类的类加载器都不同。
System.out.println("ClassLoader : " + Employee.class.getClassLoader());
System.out.println(session.getClass().getClassLoader()); //Hibernate Session object
ClassLoader : org.springframework.boot.devtools.restart.classloader.RestartClassLoader@a3af3c
sun.misc.Launcher$AppClassLoader@1d16e93
由于这种依赖性,我面临这个问题。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
当我对此进行评论时,我的代码可以正常工作,因此,我建议您检查一下您的罐子。
System.out.println("ClassLoader : " + Employee.class.getClassLoader());
System.out.println(session.getClass().getClassLoader()); //Hibernate Session object
ClassLoader : sun.misc.Launcher$AppClassLoader@1d16e93
sun.misc.Launcher$AppClassLoader@1d16e93
希望此答案对您有所帮助。