去掉與Hibernate有關的HibernateUtil,HibernateFilter, 以及所有的Hibernate配置和映射文件~_~
IUserDAO, IMessageDAO等DAO接口基本不變,只需要在類前面加上@Remote~_~
DAO接口的實現基本不變,只需要在類前面加上@Stateless,并定義一個叫javax.persistence.EntityManager的萬能類(和Spring中的 getHibernateTemplate()差不多但是比它還要簡單~_~)
DAO接口的EJB3實現像下面這樣
public ? class ?MessageDAO? implements ?IMessageDAO?{
????@PersistenceContext(type = PersistenceContextType.TRANSACTION,?unitName? = ? " message " )
???? private ?EntityManager?manager;
???? public ? void ?saveMessage(Message?m)?{
????????manager.persist(m);
????}
???? public ? void ?updateMessage(Message?m)?{
???????? if ?(manager.find(Message. class ,?m.getId())? == ? null )?{
???????????? throw ? new ?RuntimeException( " Unable?to?update? " ? + ?m
???????????????????? + ? " ?because?there?is?no?prior?version " );
????????}
????????manager.merge(m);
????}
???? public ?List?getMessages()?{
????????String?sql? = ? " select?m?from?Message?m " ;
???????? return ?manager.createQuery(sql).getResultList();
????}
???? public ? void ?deleteMessage(String?id,?String?userId)?{
????????Message?msg? = ?getMessage(id);
???????? if ?(msg? == ? null )?{
???????????? throw ? new ?MessageDAOException( " Can't?find?the?message?u?wanna?del! " );
????????}
???????? if ?( ! msg.getUser().getId().equals(userId))?{
???????????? throw ? new ?MessageDAOException( " U?cannot?del?others'?message! " );
????????}
???????? if ?(manager.contains(msg))?{
????????????manager.remove(msg);
????????}? else ?{
????????????removeMessage(msg.getId());
????????}
????}
???? public ? void ?removeMessage(String?id)?{
????????manager.createQuery( " DELETE?FROM?Message?m?WHERE?m.id?=?:mid " )
????????????????.setParameter( " mid " ,?id).executeUpdate();
????}
???? public ?Message?getMessage(String?id)?{
???????? return ?(Message)?manager.find(Message. class ,?id);
????}
}
(看看是不是比Hibernate3.0簡單,好像Hibernate3.2和這個一樣,偶還沒試過3.2)
最后最關鍵的是實體定義和映射,到regsaga上面看了篇講解Annotation的文章
(
http://wiki.redsaga.com/confluence/display/HART/Mapping+entity+bean+associations+relationships
)
原來Hibernate和EJB3的注解出自同門,我好像又明白了一點什么~_~
改完了,要開始測試了,真是激動人心。
確保D:\jboss-4.0.4.GA\server\default\lib\mysql-connector-java-3.1.12-bin.jar
然后拷貝D:\jboss-4.0.4.GA\docs\examples\jca\mysql-ds.xml
到D:\jboss-4.0.4.GA\server\default\deploy并做小部分修改
~_~。
好像還要加一個persistence.xml一起打在jar包里邊。寫一個Ant任務吧,大家都這么做(還沒有在Eclipse下打包并發布的經驗,只會
JBuilder~_~)
幾番周折,給Ant加了打jar包打war包以及deploy的任務。
啟動JBoss-4.0.4-GA,出了些錯誤,一一改正。。
JUnit測試通過了,但打開JSP頁面注冊時報錯
18:31:28,859 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
java.lang.reflect.UndeclaredThrowableException
?at $Proxy177.saveUser(Unknown Source)
?at org.apache.jsp.regist_jsp._jspService(regist_jsp.java:64)
?at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
?at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
?at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
?at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
?at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
?at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
?at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
?at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
?at cn.hxex.message.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:127)
?at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
?at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
?at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
?at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
?at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
?at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
?at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
?at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
?at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
?at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
?at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
?at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
?at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
?at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
?at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
?at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
?at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
?at java.lang.Thread.run(Thread.java:595)
Caused by: java.io.NotSerializableException: cn.hxex.message.model.User
?at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075)
?at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1245)
?at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1069)
?at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:291)
?at java.rmi.MarshalledObject.<init>(MarshalledObject.java:92)
?at org.jboss.aop.joinpoint.MethodInvocation.writeExternal(MethodInvocation.java:318)
?at org.jboss.serial.persister.ExternalizePersister.writeData(ExternalizePersister.java:58)
?at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.describeObject(ObjectDescriptorFactory.java:275)
?at org.jboss.serial.objectmetamodel.DataContainer$DataContainerOutput.writeObject(DataContainer.java:386)
?at org.jboss.serial.io.MarshalledObjectForLocalCalls.<init>(MarshalledObjectForLocalCalls.java:38)
?at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:57)
?at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
?at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:102)
?... 29 more
始終沒法解決,非常傷心,也很郁悶。決定先放棄一段時間。。。。。。。。