java-java.lang.ClassCastException调用getSingleResult()方法?

java-java.lang.ClassCastException调用getSingleResult()方法?,java,mysql,exception,jpa,jdbc,Java,Mysql,Exception,Jpa,Jdbc,我有以下java类使用JPA连接和查询MySQL数据库: public class UserEntityManager { private EntityManagerFactory emf; private EntityManager em; private EntityTransaction tx; public UserEntityManager() { emf = Persistence.createEntityManagerFactory("OmegaThingsPU");

我有以下java类使用JPA连接和查询MySQL数据库:

public class UserEntityManager {

private EntityManagerFactory emf;
private EntityManager em;
private EntityTransaction tx;

public UserEntityManager() {
    emf = Persistence.createEntityManagerFactory("OmegaThingsPU");
    em = emf.createEntityManager();
    tx = em.getTransaction();
}

public User getUser(String username, String password) {
    Query query = em.createQuery("SELECT u FROM User u "
            + "WHERE u.userUsername = :userUsername "
            + "AND u.userPassword = :userPassword");
    query.setParameter("userUsername", username);
    query.setParameter("userPassword", password);
    User user;
    try {
        user = (User) query.getSingleResult();
        em.close();
        emf.close();
        return user;
    } catch (Exception ex) {
        System.out.println("Exception ****************** ");
        System.out.println(ex.toString());
        em.close();
        emf.close();
        return null;
    } 
}
}  
我总是遇到这样的例外:

java.lang.ClassCastException: com.omegathings.persistant.User cannot be cast to com.omegathings.persistant.User  
我尝试了getResultList().get(0),但它也不起作用,我缺少什么

更新:
重新启动glassfish服务器(版本4.1)将暂时解决该问题,但在修改代码和重新部署应用程序时,我再次遇到异常

更新:
似乎在重新部署应用程序时,我得到了两个不同的类加载器,如下所示:

WebappClassLoader (delegate=true; repositories=WEB-INF/classes/)  
WebappClassLoader (delegate=true)    
org.glassfish.internal.api.DelegatingClassLoader@5b11b82d  
org.glassfish.internal.api.DelegatingClassLoader@5b11b82d  
更新:
打印出上述2个类加载器的父类会导致以下结果:

WebappClassLoader (delegate=true; repositories=WEB-INF/classes/)  
WebappClassLoader (delegate=true)    
org.glassfish.internal.api.DelegatingClassLoader@5b11b82d  
org.glassfish.internal.api.DelegatingClassLoader@5b11b82d  
如您所见,在第一次部署时,ID是相同的。
现在,在第二次部署中,我得到了:

org.glassfish.internal.api.DelegatingClassLoader@57c83b1d  
org.glassfish.internal.api.DelegatingClassLoader@5b11b82d  

如果两个父母有不同的ID,我不确定这是否有助于解决我的问题。

经过多次测试,我终于找到了问题。…
以下websocket代码中存在问题:

@ServerEndpoint("/endpoint/{authentication}")
public class WSManager {  
UserEntityManager userEntityManager = new UserEntityManager();  
@OnOpen
public void onOpen(Session session, @PathParam("authentication") String authString) {  
User user = new User();
user = (User) userEntityManager.getUser(parameter[0]);}  
问题是在以下任何websocket类方法(onOpen、onMessage、onError、onClose)之外实例化UserEntityManager

只需将实例化移动到onOpen方法中就可以解决问题


我无法详细说明这种行为的原因,因此,也许有些专家会这样做。

只是一个观察。读取操作不需要事务。该错误消息似乎表明类
用户
已使用两个不同的
类加载器
加载。尝试
System.out.println(User.class.getClassLoader())
System.out.println(query.getSingleResult().getClass().getClassLoader())。如果您得到不同的结果,这就解释了强制转换失败的原因。pbabcdefp,您是对的,在第一次部署时,我得到了两个类加载器:WebappClassLoader(delegate=true;repositories=WEB-INF/classes/)……然后在再次部署后,我得到了……:WebappClassLoader(delegate=true;repositories=WEB-INF/classes/)和WebappClassLoader(delegate=true)。原因是什么?怎么解决?我承认我不知道怎么解决。我所做的只是谷歌“ClassCastException同一个类”。在这方面还有其他问题,我想看看。为什么要在事务内部创建查询,然后在事务外部执行?这似乎是一件很奇怪的事