java使用Myeclipse創建Hibernate項目碰到的諸多問題總結
這兩天一直在搞Myeclipse創建Hibernate的1對多映射。
由於缺乏經驗,可算是把我坑慘了。控制臺是不停地報錯啊~~~~我差點就崩潰了。
1.看的是慕課網的Hibernate一對多映射教程,由於老師Myeclipse的Hibernate高版本是3.3,於是老師就自己
下載了4.3版本,拖拽到項目中,然後所有的文件(hibernate.cfg.xml;**.hbm.xml;sessionFactory工具類以
及持久化類和SQL生成表的代碼)都是手寫~~~
2.然後我稍微看了一下馬士兵老師的Hibernate講解,看了一章:到底是先創建類還是先創建表。得出的結論是:
理論上是先創建類然後再創建表,但是實際項目開發幾乎都會先建表然後再建類。
而且Myeclipse是可以根據表反向生成持久化類的(以及各種配置文件和工具類),大大地簡化了工作量。
3.於是,先為項目添加Hibernate規則,自動生成了hibernate.cfg.xml工具類,然後建表grade和student,
grade的主鍵是student的外鍵,然後Myeclipse連接上數據庫,點擊表右鍵,選擇Hibernate***,選擇生成
持久類的位置,然後選擇主鍵生成機制:這裏註意一下,雖然說native會根據底層數據庫自動選擇生成機
制,但是,最好還是顯式地選擇機制(assigned:手動添加;increment:自動遞增;等等)。
然後選擇表的關聯:
這裏註意上面兩個框要是打鉤的話,會同時幫你生成與此表有關聯的表的持久化類和配置文件,我們打鉤!省得表
多的話要多操作幾次。
4.好,這樣就已經生成了數據庫表對應的持久化類和配置文件
-----------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
但是問題就會出現在這裏,我們做的是一對多的映射,Grade.hbm.xml有 <one-to-many class="file.Student" />屬
性是正常的,因為班級要對應多名學生,可是Myeclipse為我們生成Student.hbm.xml文件時,自動添加了
<many-to-one name="grade" class="file.Grade" fetch="select">
<column name="gid" />
</many-to-one>
我們的這個demo是不需要many-to-one的,所以這個文件的這個屬性字段應該刪除。
5.我們再來看Student.java這個持久化類:
1 private Integer sid; 2 private Grade grade; 3 private String sname; 4 private String sex;
我們為student表添加了一個外鍵(對應grade表的主鍵),但是Myeclipse生成持久化類的時候卻為這個類添加了一
個Grade類的屬性grade,並為其配置了getter、setter方法,這是不需要的!立馬刪除!構造方法裏面的Grade參數
也要刪除!
6.如此一來,我們可以安心地寫測試類了
1 public class TTest { 2 private Session session; 3 private Transaction transaction; 4 5 @Before 6 public void init() { 7 session = HibernateSessionFactory.getSession(); 8 transaction = session.beginTransaction(); 9 } 10 11 @After 12 public void distory() { 13 transaction.commit(); 14 session.close(); 15 } 16 17 @Test 18 public void todo() { 19 Grade g = new Grade(104, "java", "java學習1班"); 20 Student s = new Student(12, "桔子桑", "男"); 21 g.getStudents().add(s); 22 session.save(g); 23 session.save(s); 24 } 25 }
這是用JUnit單元測試工具寫的測試類,前面兩個方法就是一些初始化,銷毀操作,真正的操作細節在todo()方法
裏,我們來看一下這個方法:
首先建一個班級,班級號(gid)也就是student表的外鍵為104;
再建一個學生學號為12,註意這裏是沒有外鍵字段gid的,學生表的持久類Student裏面也是沒有的;
然後取得班級的Students屬性(持久化類是就已經生成,類型是個Set表,用於存儲班級的學生),並為其添加這
個學生s,然後save,save。
接下來看生成的數據庫表:
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
就這樣,在為班級表添加學生的時候,也就自動匹配了學生表的gid字段值。
完結撒花~~~~~~~~~
java使用Myeclipse創建Hibernate項目碰到的諸多問題總結