EJB3中的多對多關係

NO IMAGE

下午弄了很久,看了別人的教程。配置出來要麼就是資料庫不符合多對多的關係,要麼就是根本不符合邏輯。

 

後來找到別人的教程的例子,雖然表建立正確了,但是關係只能有一方控制,這可麻煩的很呢。比如:

 

以前在Hibernate中 知道 預設不配置invser的話 就是雙方維護關係,比如 在 一個多對多的關係中A和B

,如果雙方都維護關係的話,那麼不管刪除A還是刪除B ,都可以同時刪除它們之間對應的關係。

但是在EJB3中,卻不能這樣做,mappedBy配置在A段的話,那麼就是B來維護關係了。那麼如果A和B之間存在5個個關聯的關係 ,當刪除A的時候A和B的關係就還存在,這些關係是垃圾資料,A都不存在了還要A和B的關係幹嘛?。這樣是不是EJB3中的一個BUG???

或者高手給出一個好點的方案 最近愛上了EJB3 ,同時擁有的回撥方法和方法攔截尤其讓我更是歡喜,不會因為這些讓我不爽吧。

 

現在這樣類配置: 直接貼程式碼了。2個類

 

  1. /**
  2.  * 
  3.  */
  4. package com.tsts.oa.bean;
  5. import java.io.Serializable;
  6. import java.util.ArrayList;
  7. import java.util.Date;
  8. import java.util.List;
  9. import javax.persistence.CascadeType;
  10. import javax.persistence.Column;
  11. import javax.persistence.Entity;
  12. import javax.persistence.FetchType;
  13. import javax.persistence.GeneratedValue;
  14. import javax.persistence.GenerationType;
  15. import javax.persistence.Id;
  16. import javax.persistence.JoinColumn;
  17. import javax.persistence.JoinTable;
  18. import javax.persistence.ManyToMany;
  19. import javax.persistence.Table;
  20. /**
  21.  * @author sunyanan
  22.  * 
  23.  */
  24. @Table
  25. @Entity
  26. @SuppressWarnings(“serial”)
  27. public class Role implements Serializable {
  28.     private Long id; // 物件ID
  29.     private Date createDate; // 物件建立日期
  30.     private Date modifyDate; // 物件修改日期
  31.     private String roleName; // 角色名稱
  32.     
  33.     private List<Staff> roleStaff = new ArrayList<Staff>(); // 該角色下包含的員工
  34.     @Id @GeneratedValue(strategy=GenerationType.SEQUENCE)
  35.     public Long getId() {
  36.         return id;
  37.     }
  38.     public void setId(Long id) {
  39.         this.id = id;
  40.     }
  41.     public Date getCreateDate() {
  42.         return createDate;
  43.     }
  44.     public void setCreateDate(Date createDate) {
  45.         this.createDate = createDate;
  46.     }
  47.     public Date getModifyDate() {
  48.         return modifyDate;
  49.     }
  50.     public void setModifyDate(Date modifyDate) {
  51.         this.modifyDate = modifyDate;
  52.     }
  53.     @Column(length=250)
  54.     public String getRoleName() {
  55.         return roleName;
  56.     }
  57.     public void setRoleName(String roleName) {
  58.         this.roleName = roleName;
  59.     }
  60.     @ManyToMany(cascade=CascadeType.REMOVE, fetch=FetchType.EAGER)
  61.     @JoinTable(name=”rea_staff_role”, 
  62.             joinColumns={@JoinColumn(name=”role_id”)},
  63.             inverseJoinColumns={@JoinColumn(name=”staff_id”)}
  64.         )
  65.     public List<Staff> getRoleStaff() {
  66.         return roleStaff;
  67.     }
  68.     public void setRoleStaff(List<Staff> roleStaff) {
  69.         this.roleStaff = roleStaff;
  70.     }
  71. }
  1. /**
  2.  * 
  3.  */
  4. package com.tsts.oa.bean;
  5. import java.io.Serializable;
  6. import java.util.ArrayList;
  7. import java.util.Date;
  8. import java.util.List;
  9. import javax.persistence.CascadeType;
  10. import javax.persistence.Column;
  11. import javax.persistence.Entity;
  12. import javax.persistence.FetchType;
  13. import javax.persistence.GeneratedValue;
  14. import javax.persistence.GenerationType;
  15. import javax.persistence.Id;
  16. import javax.persistence.JoinColumn;
  17. import javax.persistence.JoinTable;
  18. import javax.persistence.ManyToMany;
  19. import javax.persistence.Table;
  20. /**
  21.  * @author sunyanan
  22.  * 
  23.  * 員工實體類
  24.  * 
  25.  */
  26. @Table
  27. @Entity
  28. @SuppressWarnings(“serial”)
  29. public class Staff implements Serializable {
  30.     private Long id; // 記錄id
  31.     private Date createDate; // 物件建立日期
  32.     private Date modifyDate; // 物件修改日期
  33.     private String loginId; // 登入id
  34.     private String name; // 真實名字
  35.     private String password; // 密碼
  36.     private String email; // 郵箱
  37.     private char sex; // 性別
  38.     
  39.     private List<Role> staffRole = new ArrayList<Role>(); // 該員工所擁有的角色組
  40.     @Id @GeneratedValue(strategy=GenerationType.SEQUENCE)
  41.     public Long getId() {
  42.         return id;
  43.     }
  44.     public void setId(Long id) {
  45.         this.id = id;
  46.     }
  47.     @Column(length=50)
  48.     public String getLoginId() {
  49.         return loginId;
  50.     }
  51.     public void setLoginId(String loginId) {
  52.         this.loginId = loginId;
  53.     }
  54.     @Column(length=50)
  55.     public String getName() {
  56.         return name;
  57.     }
  58.     public void setName(String name) {
  59.         this.name = name;
  60.     }
  61.     @Column(length=50)
  62.     public String getPassword() {
  63.         return password;
  64.     }
  65.     public void setPassword(String password) {
  66.         this.password = password;
  67.     }
  68.     @Column(length=50)
  69.     public String getEmail() {
  70.         return email;
  71.     }
  72.     public void setEmail(String email) {
  73.         this.email = email;
  74.     }
  75.     @Column(length=2)
  76.     public char getSex() {
  77.         return sex;
  78.     }
  79.     public void setSex(char sex) {
  80.         this.sex = sex;
  81.     }
  82.     public Date getCreateDate() {
  83.         return createDate;
  84.     }
  85.     public void setCreateDate(Date createDate) {
  86.         this.createDate = createDate;
  87.     }
  88.     public Date getModifyDate() {
  89.         return modifyDate;
  90.     }
  91.     public void setModifyDate(Date modifyDate) {
  92.         this.modifyDate = modifyDate;
  93.     }
  94.     @ManyToMany(cascade=CascadeType.REMOVE, fetch=FetchType.EAGER)
  95.     @JoinTable(name=”rea_staff_role”, 
  96.             joinColumns={@JoinColumn(name=”staff_id”)},
  97.             inverseJoinColumns={@JoinColumn(name=”role_id”)}
  98.         )
  99.     public List<Role> getStaffRole() {
  100.         return staffRole;
  101.     }
  102.     public void setStaffRole(List<Role> staffRole) {
  103.         this.staffRole = staffRole;
  104.     }
  105.     
  106. }