Hibernate 反向生成檔案報錯解決方法
昨天用myeclipse6.5反向生成hibernate的POJO+*.hbm.xml出現這個錯誤:
……
Association references unmapped class:Appraise
……
昨晚在網上查了半天,沒找到解決方法,很鬱悶於是睡覺去了。今天繼續找原因,終於找到這篇文章了,看了下,我問題的原因基本跟真篇文章描述的八九不離十,照他的辦法,把這個錯誤解決掉了,特意轉這篇文章過來了。
1 開始生成的POJO+*.hbm.xml在工程的default包下,之後被我移到了,yangting.bookshop.model包下了,但我沒有修改對映檔案,於是給我報了以上錯誤.
2 在每個POJO的對映檔案中的<hibernate-mapping package="yangting.bookshop.model">
applicationContext.xml中的片段:
<property name="mappingResources">
<list>
<value>yangting/bookshop/model/Bbs.hbm.xml</value>
<value>yangting/bookshop/model/Book.hbm.xml</value>
<value>yangting/bookshop/model/Manager.hbm.xml</value>
<value>yangting/bookshop/model/Order.hbm.xml</value>
<value>yangting/bookshop/model/OrderDetail.hbm.xml</value>
<value>yangting/bookshop/model/Type.hbm.xml</value>
<value>yangting/bookshop/model/User.hbm.xml</value>
<value>yangting/bookshop/model/Appraise.hbm.xml</value>
</list>
</property>
3 改了之後,又有點不幸,控制檯又報了個小錯誤 :
嚴重: Exception starting filter Struts2
Caught exception while loading file struts-default .xml -
[unknown location]
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles(XmlConfigurationProvider.java:839)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadDocuments(XmlConfigurationProvider.java:131)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.init(XmlConfigurationProvider.java:100)
.....
Caused by: java.lang.ClassCastException: org.apache.xerces.parsers.XML11Configuration cannot be cast to org.apache.xerces.xni.parser.XMLParserConfiguration
at org.apache.xerces.parsers.DOMParser.<init>(Unknown Source)
at org.apache.xerces.parsers.DOMParser.<init>(Unknown Source)
現在問題都解決了。
參考文章:
在用myeclipse的Hibernate外掛通過資料表自動生成PO的時候遇到了這樣的錯誤:
Exception in thread "main" org.hibernate.MappingException: Association references unmapped class: User
at org.hibernate.cfg.HbmBinder.bindCollectionSecondPass(HbmBinder.java:2380)
at org.hibernate.cfg.HbmBinder$CollectionSecondPass.secondPass(HbmBinder.java:2662)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:43)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1130)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1286)
at free_50.NewsManager.main(NewsManager.java:17)
然後GG和BD了一陣,都沒解決。很煩躁。
之後一個一個檔案去看,最後結合之前手工寫的PO和檢視書籍找到了原因:
因為myeclipse自動生成的*.hbm.xml對映檔案出來問題,在進行<many-to-one>的對映中的class設定有誤,自動生成的對映檔案在這地方只是寫上類名,而實際上要寫上包括包名在內的類名。
ps:後來發現,原來是我移動了生成後的POJO和對映檔案,但是對映檔案卻沒隨之更改過來,所以要改地址,其實只要改 變<hibernate-mapping package="model.bean">在這裡加入package就OK了,不需要一個個的去改。
只要改過來問題就解決了。
順便把測試程式碼發一下,做個記錄:
Java程式碼- package SessionFactory;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import cn.free_50.model.bean.*;
- public class NewsManager {
- public static void main(String[] args) throws Exception {
- //例項化Session
- Session sess = HibernateSessionFactory.getSession();
- //開始事務
- Transaction tc = sess.beginTransaction();
- User u = new User();
- //設定訊息標題和訊息內容
- u.setUserName("wl" );
- Group group = new Group();
- group.setGroupName("管理員" );
- group.setGroupDesc("管理論壇事物" );
- u.setGroup(group);
- //儲存訊息
- sess.save(u);
- //提交事務
- tc.commit();
- //關閉Session
- HibernateSessionFactory.closeSession();
- }
- }