學習hibernate很關鍵的一個地方就是關聯映射,今天我們來扒啦扒拉hibernate映射關系中的多對一單向和一對多單向。
首先來說一下多對一單向,也就是N-->1,多對一的例子在生活中還是很常見的吧,比如多個人住在一個地方,多個學生在一個班級,所謂的多對一就是通過多的一方能夠找到
一得一方,既然是單向的,那么肯定是一是找不到多的,什么意思呢?就是知道張三是一年級一班的,但是不知道一年級一班有張三這個人,如果我非要知道怎么辦呢?涼拌唄,這個。。開個玩笑啊,如果想通過班級知道學生,那么肯定的是雙向的,或者是一對多單向的。下面通過地址和人員的例子說一下單向多對一的關系:
既然是hibernate,那么肯定要有實體類了,我是采用注解的方式實現的,首先是人員的實體類,也就是多的一段,下面上圖:

下面是對應的set/get方法,我就不再詳細說了,注解的意思里面注釋也有,也不再贅述。
下面是地址對應的實體類。

由于是多對一單向的,所以在一得一端不必做過多的設置,只需要把實體類需要的基本屬性給了就可以了。
然后我們來做個測試,工具是JUNIT4,不廢話,上圖:

運行的結果是什么呢?我們可以看一下:
我們可以看到ibernate向數據庫中添加了兩條地址信息,然后修改人員表的地址信息。有人會說你這里是你這里分別執行了session.persist(a);和session.persist(a1);才保存成功,那我想直接保存一個人員的時候就把地址給保存進去,那么怎么辦呢?按照上面的配置也是可以實現的哦,

在這我把這兩個保存地址的給注釋掉了,運行結果怎么樣呢?

我們可以看到運行結果是一模一樣的哦,這是因為有了@Cascade(org.hibernate.annotations.CascadeType.ALL)這個配置,如果把這個去掉可是會報錯的,具體的看下:

可以看到JUNIT報錯了,具體的意思就是在非空的屬性指向個瞬時的對象,瞬時的 對象必須保存在這個操作中。主要就是cascade的作用了,cascade有五個屬性值,分別對應不同的操作,大家看一下就可以了。
上面的操作是在人員的表中添加一個地址的ID字段,不會再生成一個第三方表,如果想生成第三方表怎么設置呢?
其他的操作沒什么不同的,下面上圖:

注釋上說的也差不多了,大家也可以采用配置文件的方式來寫,本來想一對多單向和多對一單向一起說的,但是這個太長了,再開一個來寫一對多單向的,這篇暫時就這樣了。
新聞熱點
疑難解答