標籤:版本 sign 外鍵 代碼 close 右鍵 java學習 mit nat
這兩天一直在搞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 @After12 public void distory() {13 transaction.commit();14 session.close();15 }16 17 @Test18 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項目碰到的諸多問題總結