我正在尝试在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;
}
}
答案 0 :(得分:3)
persist
方法可能在服务器端失败,com.microsoft.sqlserver.jdbc.SQLServerException
被捕获并包裹在EJBException
中。
当客户端代码收到异常时,它无法解组/反序列化该com.microsoft.sqlserver.jdbc.SQLServerException
实例,因为它在客户端ClassPath
中不存在。
在客户端ClassPath
中添加MS SqlServer JDBC驱动程序应解决此问题,但我建议您避免将完整的服务器端异常传输到客户端代码,这要归功于此体系结构指南:
EJBException
中,不要包装原始异常,而是从原始String
创建一个错误消息getMessage()
,并将UUID引用到已记录的完整堆栈跟踪答案 1 :(得分:0)
修复了问题,原来生成的实体类无法正确处理模式。即使您已将连接配置为连接到特定架构,生成的实体类也不会在它们所做的任何查询中指定架构。此外,生成的类不会在表名周围使用方括号,这可能会导致其他问题。