1. 程式人生 > >java使用Myeclipse創建Hibernate項目碰到的諸多問題總結

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

int incr 會同 3.3 遞增 ring 測試工具 崩潰 配置文件

這兩天一直在搞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項目碰到的諸多問題總結