无法加载类 - JDBC

时间:2013-12-22 00:53:09

标签: java-ee netbeans jdbc

我正在尝试在Glassfish 4.0上运行JavaEE项目但是当我尝试将插入(持久化)刷新到Sql Server DB时,它会抛出此错误:

org.omg.CORBA.MARSHAL: WARNING: 00810057: Could not load class com.microsoft.sqlserver.jdbc.SQLServerException  vmcid: OMG  minor code: 57 completed: Maybe

该连接在Netbeans中用于运行命令和生成实体类。

Bean方法:

    public int addUser(UserDetails u) {
    try{
        User uP  = new User(u.getUserName(), u.isEnabled(), u.isAdmin());
        em.persist(uP);
        return 0;
    }
    catch(Exception e)
    {
        throw new EJBException(e);
    }
}

的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="LibraryBeanPU" transaction-type="JTA">
    <jta-data-source>JavaEE_Library</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties/>
  </persistence-unit>
</persistence>

客户端:

    public static void main(String[] args) {
    LibraryClient lc = new LibraryClient();
}

public LibraryClient()
{
    LibraryFacadeRemote request = (LibraryFacadeRemote) getEJBBean("LibraryFacade");
    request.addUser(new UserDetails("admin", true, true));
}

public Object getEJBBean(String beanName) { 
    try {
        InitialContext ctx = new InitialContext();
        return ctx.lookup(beanName);
    } catch (Exception ex) {
        System.err.println("ERROR: while locating bean from the server " + ex.getMessage());
        return null;      
    }
}

2 个答案:

答案 0 :(得分:3)

persist方法可能在服务器端失败,com.microsoft.sqlserver.jdbc.SQLServerException被捕获并包裹在EJBException中。

当客户端代码收到异常时,它无法解组/反序列化该com.microsoft.sqlserver.jdbc.SQLServerException实例,因为它在客户端ClassPath中不存在。

在客户端ClassPath中添加MS SqlServer JDBC驱动程序应解决此问题,但我建议您避免将完整的服务器端异常传输到客户端代码,这要归功于此体系结构指南:

  • 使用服务器上的日志记录框架以完整堆栈跟踪和生成的事件UUID记录任何捕获的异常
  • EJBException中,不要包装原始异常,而是从原始String创建一个错误消息getMessage(),并将UUID引用到已记录的完整堆栈跟踪

答案 1 :(得分:0)

修复了问题,原来生成的实体类无法正确处理模式。即使您已将连接配置为连接到特定架构,生成的实体类也不会在它们所做的任何查询中指定架构。此外,生成的类不会在表名周围使用方括号,这可能会导致其他问题。