Hibernate 奇怪的问题!

03-08-21 yadan
Hibernate 奇怪的问题!

写了一些hibernate存储查询的方法,用EJB session bean来封装其调用,然后把这些EJB都成功发布到jboss服务器上。

新建一个测试工程,只把EJB包和一些实体/Model类加入工程CLASSPATH中,在这个工程里面写一些类来测试session bean中

的方法。按我的理解,hibernate的映射和存储方法都在EJB服务器的JVM中运行,远程客户端是不需要知道任何Hibernate

相关包的。但测试中却出问题了:很多方法都不能正常运行,出现类似这样的异常:

java.lang.reflect.UndeclaredThrowableException

	at $Proxy1.getRootOrgnization(Unknown Source)

	at yadan.client.api.org.OrgManager.getRootOrgnization(OrgManager.java:220)

	at yadan.client.test.TestOrgManager.testCreateRootOrg(TestOrgManager.java:42)

	at yadan.client.test.TestOrgManager.main(TestOrgManager.java:50)

Caused by: java.lang.ClassNotFoundException: net.sf.hibernate.collection.Set (no security manager: RMI class loader disabled)

	at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:368)

	at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:159)

	at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:631)

	at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:257)

	at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:200)

	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1513)

	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1435)

	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1626)

	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)

	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)

	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)

	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)

	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)

	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)

	at java.rmi.MarshalledObject.get(MarshalledObject.java:135)

	at org.jboss.invocation.jrmp.interfaces.JRMPInvokerProxy.invoke(JRMPInvokerProxy.java:136)

	at org.jboss.invocation.InvokerInterceptor.invoke(InvokerInterceptor.java:87)

	at org.jboss.proxy.TransactionInterceptor.invoke(TransactionInterceptor.java:46)

	at org.jboss.proxy.SecurityInterceptor.invoke(SecurityInterceptor.java:45)

	at org.jboss.proxy.ejb.StatelessSessionInterceptor.invoke(StatelessSessionInterceptor.java:100)

	at org.jboss.proxy.ClientContainer.invoke(ClientContainer.java:85)

	... 4 more

Exception in thread "main" 
<p>

错误表明:客户端找不到net.sf.hibernate.collection.Set类。当我把Hibernate所有相关的jar包加入之后,就可以运行通过了。

同样的错误在web应用中出现,(我单独启一个tomcat来测试ejb的调用)web程序如果没有hibernate的jar包就不能正常运行。

非常不解!不知道是什么地方出错了,还是别的原因。请大家指点和测试!

yadan
2003-08-21 17:18
补充,我EJB发布的classpath(server\default\lib)中是加入了 ibernate相关包的。出错是因为客户端和web应用程序CLASSPATH没有加入Hibernate包。我觉得客户端和web应用程序根本没必要这些包啊!

robbin
2003-08-21 17:22
那是因为你在程序中用到了持久对象的集合属性,比如说Set。实际上这个Set不是java.util.HashSet,而是Hibernate自己实现的Set,就是net.sf.hibernate.collection.Set,所以客户端会报错。

yadan
2003-08-21 17:36
冤枉啊~~虽然我在mapping文件中有set类型的映射,但在测试hibernate的方法中根本就没有用这个set。并且把lazy设置成true。

比如说一个Org包含一个Set,Set是User的集合,但我测试的方法,只是创建一个Org,由于User表中的orgId是可以为空的,所以我创建的时候并没有在Org中加入User,但也出这个问题了。如何解释。

robbin
2003-08-21 17:42
问题就在你设的lazy="true"上。

你知道为什么Hibernate要自己实现一套集合类吗?就是为了支持延迟加载。java.util的集合类是不能够用来实现延迟加载的,所以Hibernate才自己实现,因此如果你设了lazy="true",但是在把持久对象序列化传给客户端的之前又没有初始化延迟加载的属性,就肯定会出问题。

猜你喜欢
3Go 1 2 3 下一页