1. 程式人生 > >@ManyToMany(多對多資料對映的insert、update及delete)

@ManyToMany(多對多資料對映的insert、update及delete)

對hibernete只知道皮毛的偶,一直覺得在多表聯合查詢時配置hibernate資料表的對映檔案很是麻煩的問題,最近難得有時間學習java annotation所以順便更進一步的去學習一下hibernate,雖然我現在寫這些東西在有好多人覺得是否開始有些過時,但是作為小鳥的我希望能將我的學習到的知識和經驗與更多像我一樣的小鳥們分享一下。那就廢話少說了,這裡我通過一個人員與角色的多對多例項,來與大家分享一下我的理解。

1.首先是一個User.java和Role.java的POJO類,程式碼如下:

(1) User.java

Role.java

通過上面的java annotation,可以對映到三個表,分別為:

(1) @Table(name="user") :得到表名為user的資料表。

(2) @Table(name="role")  :得到表名為role的資料表。

(3) @JoinTable(name="user_role",...)得到表名為user_role的多對多關係維護資料表。

同時,通過User.java的@ManyToMany(mappedBy="users",...)我們知道,主控方在Role.java,也就是說,當我們的Role發生delete這樣的操作時,hibernate會自動的幫我們把user_role表中與該Role有關的所有資料給delete掉。總之,當對主控方進行操作時,對於中間表的維護要相對容易,所以在這我就不多說了。而對於被控方的操作,在對中間表的維護時,很多時候我們也需要維護中間關係表,下面就是我在對被控方操作時維護中間表的例項:

A. 新增一個擁有指定角色的使用者。對於給一個使用者新增角色,我們大腦首先會想到的是將該使用者新增到指定角色的群組中,沒錯,就是這個思路,程式碼如下:

B.更新使用者。

對於更新一個使用者,對中間表的維護的思路跟上面的新增差不多,我的思路是先去掉該使用者未被更新前的所有角色,再為該使用者新增現有的角色,所以程式碼大致如下(下面的程式碼總感覺不太好,誰有好的寫法,希望留言。我在這就先拋磚引玉了):

C.刪除操作的思路也差不多,這裡我就不多說了,程式碼如下:

下面是hibernate生成的表對應的sql:


CREATE TABLE `user` (
  `user_id` varchar(7) NOT NULL,
  `user_addr` varchar(50) default NULL,
  `user_mail` varchar(20) default NULL,
  `head_img` varchar(50) default NULL,
  `user_name` varchar(20) NOT NULL,
  `user_pwd` varchar(20) NOT NULL,
  PRIMARY KEY  (`user_id`)
) ENG

CREATE TABLE `role` (
  `role_id` int(11) NOT NULL,
  `role_name` varchar(10) NOT NULL,
  PRIMARY KEY  (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `user_role` (
  `role_id` int(11) NOT NULL,
  `user_id` varchar(7) NOT NULL,
  PRIMARY KEY  (`role_id`,`user_id`),
  KEY `FK143BF46AD86B0194` (`role_id`),
  KEY `FK143BF46A7D95C574` (`user_id`),
  CONSTRAINT `FK143BF46A7D95C574` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`),
  CONSTRAINT `FK143BF46AD86B0194` FOREIGN KEY (`role_id`) REFERENCES `role` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

好了,偶就能分享這麼多了,希望對大家有用,有理解得不對的地方,歡迎大家批評指正。