一般我们用hibernateQ最喜欢用的应该是hql查询吧,较ؓ灉|写法也跟sql怼Q不q有的同志喜Ƣ用criteria查询的可能不会看到这个异怿息,呵呵?/p>
今天把一hibernate war目部v到wl10.3.3上,部v是不会报错的Q但是当你点到某个功能,q个功能下面有hql查询Q就会报错,报错信息如下Q?/p>
java.lang.RuntimeException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [select ...]; nested exception is org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [select ...]
at …
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.doIt(WebAppServletContext.java:3686)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3650)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2268)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2174)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1446)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
>
通过自己做的JarFinder工P明显可以在部|的war包中看到 org.hibernate.hql.ast.HqlToken c,在hibernate-core-3.3.0.GA.jar中,q报错不正常啊,估计是某些包跟wl冲突了,后来google了一下,扑ֈ一个国外的帖子Q说是antlr的问题,亲n试验了一ơ,果然是这个问题,现在把解决Ҏ(gu)跟大家分享下Q?/p>
你的war包打入ear包中Q当然你q需要有META-INF文gQ带有weblogic-application.xml和application.xmlQ主要就是在weblogic-application.xml中解冻I声明prefer-application-packagesQ如下所C?关键line3-5)Q?/p>
<?xml version="1.0" encoding="UTF8"?> <weblogic-application> <prefer-application-packages> <package-name>antlr.*</package-name> </prefer-application-packages> </weblogic-application>
而application.xmlp为简单了Q这里就不说了,怿打过ear包的都应该知道怎么回事Q呵?打包后再ơ发布,问题解决?/p>
附上解决问题原帖链接Q?a style="text-decoration: none; color: #3478e3; ">http://forum.springsource.org/showthread.php?t=36860
不会写application.xml的可以参考一下java的dtdQ?a style="text-decoration: none; color: #3478e3; ">http://java.sun.com/dtd/
再附上一?8q的英文文章Qblogspot的,讲的是weblogic jws+spring+hibernate开发的Q需要翻墙才能看刎ͼhttp://timezra.blogspot.com/2008/09/spring-hibernate-and-jax-ws-webservices.html
Ƣ迎讨论~
原文链接Q?span style="color: #000000; font-family: 'Times New Roman'; line-height: normal; font-size: medium; ">http://www.shaojiahao.org/java/hibernate/weblogic-hibernate-hql-problem
在Clazz的OneToMany和Course的ManyToMany中,我们都可以看到有CascadeType.PERSIST和CascadeType.REMOVE。具体到底是什么意思呢Qpersist是指当持久化实体的时候,如果有关联的集合Qƈ且设成persistӞq集合也一q存入数据库当中。但是如果真正写一下,然后使用的话Q我们会发现QOneToMany讄q个Ҏ(gu)不v作用。比如我新徏一个班U,q直接赋?0个学生的一个集合,然后调用dao的saveҎ(gu)Q看看数据库Q怎么回事Q怎么只有班持久化了Q关联学生一个没存到数据库?然后试试新徏评Qƈ且选上要修q门评学生Q然后持久化评Q看看数据库Q怎么搞的Q这ơ双斚w持久化了Q即中间表已l插入了相关的记录。造成OneToMany用persist是什么原因?个h理解Q学生属于一个实体,其持久化应当依靠自己相应的daoQ一个一个student的存储。就好比student和course的中间表Q我们上面假设中间表只有STUDENT_ID和COURSE_IDQƈ且分别连向student表和course表的主键Q如果你有特D需求,比如是要一个score列(评成WQ,那么q时候你q想用ManyToMany配置的话Q会出现好多问题Q除非你允许成W是空的,但是即成W可以为空Q如果你需要修Ҏ(gu)l怎么办呢Q先取出q个学生Q然后遍历其评集合Q找到这个课E然后再持久化不行?应该可以吧,但是是不是指需要先删除q个学生选的评Q然后再这些再ơ持久化一ơ?q个Ҏ(gu)l对可以Q不q我没h会这栗。。呵c。。当中间表有其他与两方表都没有关pȝ列时Q你应当Z间表也映一个实体,用这个实体的相应dao修改相应的记录。在q种情况下用ManyToManyq有另一个问题,如果你的hibernate sessionq没有关闭,你会发现提错Q说你打删除即再ơ持久化的记录。用OpenSessionInViewFilter的时候你׃发现q个问题了。呵c。?br />
q有一个,Hibernate官方不推荐用联合主键,原来的我׃怿用联合主键会怎样Q还不行吗?要不行那q不是你框架太烂Q实践过之后Q我改变了我的看法。。。假如你是普通的一个表Q用联合主键没有Q何问题,但是假如你的表是一个中间表Qƈ且有和两个关联表无关的列Q就像T_STUDENT_COURSEQ我们在设计数据库的时候,很容易想到用STUDENT_ID和COURSE_ID来作Z键,不错Q但是如果你用hibernate映射实体的时候你知道有什么麻烦吗Q首先这两个都是外键Q在hibernate中就是需要有两个兌实体的对象引用,那么q两个作为@Id是吧Q可以啊Q但是当你持久化的时候,会提Cstudent在T_STUDENT_COURSE中无法找到。ؓ什么?因ؓ你数据库׃个ID呀Q而你q里配的可是一个实体引用呀Q其实这也是可以解决了,是解决办法q回一点点Q在hibernate外键兌的时候可以指定实体引用,是说比如你StudentCourse实体Q有一个student的引用,可以定义q样一个columnQstudentIdQ这个Id可以兌student引用Q具体写法我׃写出来了Q在hibernate官方文档写得相当详细Q很Ҏ(gu)验证。看Q就一个外键都q样了,多个外键q得了?当然Q如果普通的单外键引用不会生这L问题Q直接配一个实体引用就可以解决问题。问题是可以解决的,关键是以后维护v来是否方便?我做q就知道Q一点不单,所以后来还是改了。。。不推荐大家使用联合主键?/p>