我有以下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,我不确定这是否有助于解决我的问题。
答案 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方法中移动实例化就可以解决问题。
我无法详细说明这种行为的原因,所以,有些专家可能会这样做。