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

时间:2015-03-08 05:53:18

标签: 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");
    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)    

更新
打印出上述2个类加载器的父级会产生以下结果:

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

正如您所看到的,在第一次部署时,Ids是相同的 现在进行第二次部署:

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

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

1 个答案:

答案 0 :(得分:0)

最后,经过多次测试后我才发现问题.... 问题出现在以下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方法中移动实例化就可以解决问题。

我无法详细说明这种行为的原因,所以,有些专家可能会这样做。