基本上像放棄MyEclipse或者Eclipse了,因為IDEA現在也有對應的版本旗艦版和社區版了,而且使用更貼心,更給力,為什么還要選一個難用的要死的東西呢?
最近要開發一個Java Web項目,所以想着就用IDEA吧,不用MyEclipse了(我用的不是正版IDEA,不過希望以后工作了可以用正版)。
由於在網上搜了很多相關的文檔,不過要么是在線文檔上的,或者一些不給力的博客網站上的,有的沒有熱部署,都不是很好,下面這個是我參考並配置成功的。
是放在百度網盤上面的一個doc文檔:http://pan.baidu.com/share/link?shareid=416907586&uk=3023119909。
我在我的網盤中也存了一份,備份地址:http://pan.baidu.com/s/1i3r57rJ
工具一般都很簡單用了,前面構建的過程應該蠻簡單的,不過最后熱部署稍微是個有意思的地方,這里可以給大家提一下。其實文檔講的很詳細,不過由於不像用Myeclipse的那樣,所以這里簡單介紹一下:(這個熱部署讓我疑惑了一下,在此簡單分享一下)
這里是配置Tomcat的界面,其實只要設置On frame deactivation為Update classes and resources 就可以了,不過上面還有一個On 'Update' action的選項列表也是一樣的,這里我們同樣也可以選擇Update classes and resources,不過后面有一個復選框是Show Dialog,就是當你點擊工具欄中的運行或者Debug按鈕的時候會彈出一個選擇框,讓你選擇是執行下面的哪一種操作。
這里如果選中showDialog,可以防止誤操作或者可以有更多的選擇了,也挺好。
由於以前習慣於用MyEclipse進行Web開發,這次用IDEA開發還是碰到了很多問題。不過也見識到了IDEA超強的代碼提示和其他方法的優秀特征。比如他可以對SQL語句進行代碼提示,對配置在多個文件中的spring配置文件進行提示,反正是只有你想不到,沒有他做不到。不過也會有一些很不習慣的地方,還是要在這篇博文中多做一些記錄,前幾天碰到的各種問題,現在想起來真該記錄下來,不過現在也只能碰到什么問題記錄什么了!
1. Hibernate反向工程:IDEA自動檢測到你使用了Hibernate框架,或者你可以通過在項目上F4的模塊中導入Hibernate支持,一旦項目使用了Hibernate,他就會有一些相關面板出來,比如Spring面板了,Persistence面板了,Web面板了,DataBase面板了(如果用到了數據庫,最好去配置一下,可以在你的程序中幫你進行代碼提示)。但是我在Persistence中針對列出來的hibernate.cfg.xml配置文件右擊generate persist mapping,進行反向工程,然后選擇數據庫等相關的設置(這里一定要看清每個選項,我就不多說了),得到了各種hbm.xml文件,但是我在運行中卻一直出問題。問題詳情如下:
最后得到的映射文件*.hbm.xml在tomcat啟動時會報錯(我用的是MYSQL),網上查了很多,說是映射的不匹配,但是我查了N久沒什么問題。最后才發現是一個簡單的問題。報的錯如下:
嚴重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.StringIndexOutOfBoundsException: String index out of range: 0 Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 0 at java.lang.String.charAt(String.java:658) at org.hibernate.mapping.Table.setSchema(Table.java:643) at org.hibernate.cfg.Mappings.addTable(Mappings.java:191) at org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java:312) at org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java:295) at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:166) at org.hibernate.cfg.Configuration.add(Configuration.java:716) at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:551) at org.hibernate.cfg.Configuration.addResource(Configuration.java:613) at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1635) at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1603) at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1582) at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1556) at org.hibernate.cfg.Configuration.configure(Configuration.java:1491) at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:634) at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:134) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1203) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1172) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:427) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:249) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:155) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:246) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:285) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352) at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:246) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:189) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633) at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1558) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:620) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:567) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1487) at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:97) at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1328) at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1420) at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:848) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322) at sun.rmi.transport.Transport$1.run(Transport.java:177) at sun.rmi.transport.Transport$1.run(Transport.java:174) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:173) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744)
然后,我各種改,最后發現解決方案如下:他默認生成的映射文件的class標簽有一個屬性:schema="",只要把這個屬性去掉就可以了,太坑爹了,搞了我很長時間,這個schema貌似可以填數據庫名吧!