java使用Myeclipse建立Hibernate項目碰到的諸多問題總結

來源:互聯網
上載者:User

標籤:版本   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項目碰到的諸多問題總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.