Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux集群 > Architecture > » 正文

ManyToMany(多对多数据映射的insert、update及delete)

来源: oywl2008 分享至:

对hibernete只知道皮毛的偶,一直觉得在多表联合查询时配置hibernate数据表的映射文件很是麻烦的问题,最近难得有时间学习java annotation所以顺便更进一步的去学习一下hibernate,虽然我现在写这些东西在有好多人觉得是否开始有些过时,但是作为小鸟的我希望能将我的学习到的知识和经验与更多像我一样的小鸟们分享一下。那就废话少说了,这里我通过一个人员与角色的多对多实例,来与大家分享一下我的理解。

1.首先是一个User.java和Role.java的POJO类,代码如下:

(1) User.java

view plaincopy to clipboardprint?
  1. package com.candy.hibernate.bean;
  2. import java.io.Serializable;
  3. import java.util.LinkedHashSet;
  4. import java.util.Set;
  5. import javax.persistence.Column;
  6. import javax.persistence.Entity;
  7. import javax.persistence.FetchType;
  8. import javax.persistence.Id;
  9. import javax.persistence.ManyToMany;
  10. import javax.persistence.Table;
  11. @Entity
  12. @Table(name="user")
  13. public class User implements Serializable {
  14. /**
  15. *
  16. */
  17. private static final long serialVersionUID = 1L;
  18. @Id
  19. @Column(name="user_id", length=7, nullable=false)
  20. private String id;
  21. @Column(name="user_name", length=20,nullable=false)
  22. private String name;
  23. @Column(name="user_pwd",length=20,nullable=false)
  24. private String password;
  25. @Column(name="user_addr",length=50)
  26. private String address;
  27. @Column(name="user_mail" ,length=20)
  28. private String email;
  29. @Column(name="head_img" ,length=50)
  30. private String headImage;
  31. @ManyToMany(mappedBy="users", fetch=FetchType.LAZY)
  32. private Set<Role> roles = new LinkedHashSet<Role>();
  33. public String getId() {
  34. return id;
  35. }
  36. public void setId(String id) {
  37. this.id = id;
  38. }
  39. public String getName() {
  40. return name;
  41. }
  42. public void setName(String name) {
  43. this.name = name;
  44. }
  45. public String getPassword() {
  46. return password;
  47. }
  48. public void setPassword(String password) {
  49. this.password = password;
  50. }
  51. public String getAddress() {
  52. return address;
  53. }
  54. public void setAddress(String address) {
  55. this.address = address;
  56. }
  57. public String getEmail() {
  58. return email;
  59. }
  60. public void setEmail(String email) {
  61. this.email = email;
  62. }
  63. public String getHeadImage() {
  64. return headImage;
  65. }
  66. public void setHeadImage(String headImage) {
  67. this.headImage = headImage;
  68. }
  69. public Set<Role> getRoles() {
  70. return roles;
  71. }
  72. public void setRoles(Set<Role> roles) {
  73. this.roles = roles;
  74. }
  75. @Override
  76. public String toString() {
  77. StringBuilder stb = new StringBuilder();
  78. stb.append("User[");
  79. stb.append("id:" + getId());
  80. stb.append(";name:" + getName());
  81. stb.append(";password:" + getPassword());
  82. stb.append(";email:" + getEmail());
  83. stb.append(";address:" + getAddress());
  84. stb.append("headImage:" + getHeadImage());
  85. stb.append("]");
  86. return stb.toString();
  87. }
  88. }

Role.java

view plaincopy to clipboardprint?
  1. package com.candy.hibernate.bean;
  2. import java.io.Serializable;
  3. import java.util.LinkedHashSet;
  4. import java.util.Set;
  5. import javax.persistence.CascadeType;
  6. import javax.persistence.Column;
  7. import javax.persistence.Entity;
  8. import javax.persistence.FetchType;
  9. import javax.persistence.Id;
  10. import javax.persistence.JoinColumn;
  11. import javax.persistence.JoinTable;
  12. import javax.persistence.ManyToMany;
  13. import javax.persistence.Table;
  14. @Entity
  15. @Table(name="role")
  16. public class Role implements Serializable {
  17. /**
  18. *
  19. */
  20. private static final long serialVersionUID = 1597271124780386657L;
  21. @Id
  22. @Column(name="role_id",length=7,nullable=false)
  23. private int id;
  24. @Column(name="role_name",length=10, nullable=false)
  25. private String role;
  26. @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
  27. @JoinTable(name="user_role",joinColumns={@JoinColumn(name="role_id")},inverseJoinColumns={@JoinColumn(name="user_id")})
  28. private Set<User> users = new LinkedHashSet<User>();
  29. @ManyToMany(mappedBy="roles")
  30. private Set<Priority> prioritys = new LinkedHashSet<Priority>();
  31. public int getId() {
  32. return id;
  33. }
  34. public void setId(int id) {
  35. this.id = id;
  36. }
  37. public String getRole() {
  38. return role;
  39. }
  40. public void setRole(String role) {
  41. this.role = role;
  42. }
  43. public Set<User> getUsers() {
  44. return users;
  45. }
  46. public void setUsers(Set<User> users) {
  47. this.users = users;
  48. }
  49. @Override
  50. public String toString() {
  51. StringBuilder stb = new StringBuilder();
  52. stb.append("Role[");
  53. stb.append("id:" + getId());
  54. stb.append(";role:" + getRole());
  55. stb.append("]");
  56. return stb.toString();
  57. }
  58. }

通过上面的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. 添加一个拥有指定角色的用户。对于给一个用户添加角色,我们大脑首先会想到的是将该用户添加到指定角色的群组中,没错,就是这个思路,代码如下:

view plaincopy to clipboardprint?
  1. public void addUser(User user) {
  2. try {
  3. for (Role role : user.getRoles()) {
  4. role.getUsers().add(user);
  5. }
  6. this.getHibernateTemplate().save(user);
  7. } catch (Exception e) {
  8. e.printStackTrace();
  9. logger.error("error occured at : ", e);
  10. }
  11. }

B.更新用户。

对于更新一个用户,对中间表的维护的思路跟上面的添加差不多,我的思路是先去掉该用户未被更新前的所有角色,再为该用户添加现有的角色,所以代码大致如下(下面的代码总感觉不太好,谁有好的写法,希望留言。我在这就先抛砖引玉了):

view plaincopy to clipboardprint?
  1. public void updateUser(User user) {
  2. try {
  3. // update user's role
  4. User oldUser = (User) this.getHibernateTemplate().get(User.class,
  5. user.getId());
  6. if (oldUser != null) {
  7. for (Role role : oldUser.getRoles()) {
  8. role.getUsers().remove(oldUser);
  9. }
  10. for (Role role : user.getRoles()) {
  11. role.getUsers().add(oldUser);
  12. }
  13. this.getHibernateTemplate().save(oldUser);
  14. // update inverse table, the middle table has not been updated
  15. this.getHibernateTemplate().merge(user);
  16. }
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. logger.error("error occured at : ", e);
  20. }
  21. }

C.删除操作的思路也差不多,这里我就不多说了,代码如下:

view plaincopy to clipboardprint?
  1. public void deleteUser(String primaryKey) {
  2. try {
  3. User user = (User) this.getHibernateTemplate().get(User.class,
  4. primaryKey);
  5. if (user != null) {
  6. // remove the relationship
  7. for (Role role : user.getRoles()) {
  8. role.getUsers().remove(user);
  9. }
  10. this.getHibernateTemplate().delete(user);
  11. }
  12. } catch (Exception e) {
  13. e.printStackTrace();
  14. logger.error("error occured at : ", e);
  15. }
  16. }

下面是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;

好了,偶就能分享这么多了,希望对大家有用,有理解得不对的地方,欢迎大家批评指正。

Link:http://blog.csdn.net/shadow55/article/details/4428059


Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史