jpa 中@ManyToMany 标签使用后,只对关联表进行删除的写法

来源:互联网 发布:照片真假辨别软件 编辑:程序博客网 时间:2024/05/01 23:03

1. 表单结构 :

  • 一个角色表TRole 
  • 一个菜单表TMenu
  • 一个角色-菜单表TRoleMenu

2.通过jpa生成pojo,用到了many2many 注释来表示关联关系后。只会生成2个实体pojo 类。中间关联表不会生成pojo类

[java] view plaincopy
  1. package com.alcor.acl.domain;  
  2. import java.io.Serializable;  
  3. import javax.persistence.*;  
  4. import java.util.Set;  
  5. /** 
  6.  * The persistent class for the t_menu database table. 
  7.  *  
  8.  */  
  9. @Entity  
  10. @Table(name="t_menu")  
  11. public class TMenu implements Serializable {  
  12.     private static final long serialVersionUID = 1L;  
  13.     @Id  
  14.     @Column(name="menu_id")  
  15.     private String menuId;  
  16.     @Column(name="menu_name")  
  17.     private String menuName;  
  18.     private int menuorder;  
  19.     private String module;  
  20.     @Column(name="parent_id")  
  21.     private String parentId;  
  22.     private String url;  
  23.     //bi-directional many-to-many association to TRole  
  24.     @ManyToMany(mappedBy="TMenus", fetch=FetchType.EAGER)  
  25.     private Set<TRole> TRoles;  
  26.     public TMenu() {  
  27.     }  
  28.     public String getMenuId() {  
  29.         return this.menuId;  
  30.     }  
  31.     public void setMenuId(String menuId) {  
  32.         this.menuId = menuId;  
  33.     }  
  34.     public String getMenuName() {  
  35.         return this.menuName;  
  36.     }  
  37.     public void setMenuName(String menuName) {  
  38.         this.menuName = menuName;  
  39.     }  
  40.     public int getMenuorder() {  
  41.         return this.menuorder;  
  42.     }  
  43.     public void setMenuorder(int menuorder) {  
  44.         this.menuorder = menuorder;  
  45.     }  
  46.     public String getModule() {  
  47.         return this.module;  
  48.     }  
  49.     public void setModule(String module) {  
  50.         this.module = module;  
  51.     }  
  52.     public String getParentId() {  
  53.         return this.parentId;  
  54.     }  
  55.     public void setParentId(String parentId) {  
  56.         this.parentId = parentId;  
  57.     }  
  58.     public String getUrl() {  
  59.         return this.url;  
  60.     }  
  61.     public void setUrl(String url) {  
  62.         this.url = url;  
  63.     }  
  64.     public Set<TRole> getTRoles() {  
  65.         return this.TRoles;  
  66.     }  
  67.     public void setTRoles(Set<TRole> TRoles) {  
  68.         this.TRoles = TRoles;  
  69.     }  
  70.       
  71. }  

[java] view plaincopy
  1. package com.alcor.acl.domain;  
  2. import java.io.Serializable;  
  3. import javax.persistence.*;  
  4. import java.util.Set;  
  5. /** 
  6.  * The persistent class for the t_role database table. 
  7.  *  
  8.  */  
  9. @Entity  
  10. @Table(name="t_role")  
  11. public class TRole implements Serializable {  
  12.     private static final long serialVersionUID = 1L;  
  13.     @Id  
  14.     @Column(name="role_id")  
  15.     private String roleId;  
  16.     private String description;  
  17.     @Column(name="role_name")  
  18.     private String roleName;  
  19.     //bi-directional many-to-many association to TMenu  
  20.     @ManyToMany(fetch=FetchType.EAGER)  
  21.     @JoinTable(  
  22.         name="t_role_menu"  
  23.         , joinColumns={  
  24.             @JoinColumn(name="role_id")  
  25.             }  
  26.         , inverseJoinColumns={  
  27.             @JoinColumn(name="menu_id")  
  28.             }  
  29.         )  
  30.     private Set<TMenu> TMenus;  
  31.     //bi-directional many-to-many association to TUser  
  32.     @ManyToMany(mappedBy="TRoles", fetch=FetchType.EAGER)  
  33.     private Set<TUser> TUsers;  
  34.     public TRole() {  
  35.     }  
  36.     public String getRoleId() {  
  37.         return this.roleId;  
  38.     }  
  39.     public void setRoleId(String roleId) {  
  40.         this.roleId = roleId;  
  41.     }  
  42.     public String getDescription() {  
  43.         return this.description;  
  44.     }  
  45.     public void setDescription(String description) {  
  46.         this.description = description;  
  47.     }  
  48.     public String getRoleName() {  
  49.         return this.roleName;  
  50.     }  
  51.     public void setRoleName(String roleName) {  
  52.         this.roleName = roleName;  
  53.     }  
  54.     public Set<TMenu> getTMenus() {  
  55.         return this.TMenus;  
  56.     }  
  57.     public void setTMenus(Set<TMenu> TMenus) {  
  58.         this.TMenus = TMenus;  
  59.     }  
  60.       
  61.     public Set<TUser> getTUsers() {  
  62.         return this.TUsers;  
  63.     }  
  64.     public void setTUsers(Set<TUser> TUsers) {  
  65.         this.TUsers = TUsers;  
  66.     }  
  67.       
  68. }  

3.如果需求是只要求解除菜单和角色的关联关系,而不是去删除菜单或者角色。就需要用这样的语法

[java] view plaincopy
  1. tRole.getTMenus().remove(tMenu);  
  2.             em.merge(tRole);  

注意:只能通过tRole来发起

 

不能写成这样

[java] view plaincopy
  1. tMenu.getTRole().remove(tRole);         em.merge(tMenu);  

这是因为:在pojo的@Many2Many标签只有在TRole这个里面设置了joinColumns属性,指定关系维护端(owner side),即TRole类本身.


使用JoinColumn,name指向数据库字段,referencedColumnName指向实体类里面的属 性,当数据库字段与实体类的名字相同的时候可以省略.


设置inverseJoinColumns,指定关系被维护端(inverse side),即映射到TMenu类,设置方法与joinColumns一样.

0 0