2013-09-23 52 views
0

我想用連接表創建實體。我有實體用戶和組。在數據庫中,我有另一個表usersgroups。當我將用戶添加到組並保存新的條目在組表中創建。什麼可能是錯誤?JPA中的多對多關係與連接表

用戶實體:

@Entity 
@Table(schema = "useradministration") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"), 
    @NamedQuery(name = "Users.findByUserid", query = "SELECT u FROM Users u WHERE u.userid = :userid"), 
    @NamedQuery(name = "Users.findByUsername", query = "SELECT u FROM Users u WHERE u.username = :username"), 
    @NamedQuery(name = "Users.findByUserpassword", query = "SELECT u FROM Users u WHERE u.userpassword = :userpassword"), 
    @NamedQuery(name = "Users.findByFirstname", query = "SELECT u FROM Users u WHERE u.firstname = :firstname"), 
    @NamedQuery(name = "Users.findByMiddlename", query = "SELECT u FROM Users u WHERE u.middlename = :middlename"), 
    @NamedQuery(name = "Users.findByLastname", query = "SELECT u FROM Users u WHERE u.lastname = :lastname")}) 
public class Users implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @SequenceGenerator(name = "useradministration.users_userid_seq", 
      sequenceName = "useradministration.users_userid_seq", 
      allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, 
      generator = "useradministration.users_userid_seq") 
    @Basic(optional = false) 
    @Column(nullable = false) 
    private Integer userid; 
    @Size(max = 50) 
    @Column(length = 50) 
    private String username; 
    @Size(max = 200) 
    @Column(length = 200) 
    private String userpassword; 
    @Size(max = 100) 
    @Column(length = 100) 
    private String firstname; 
    @Size(max = 100) 
    @Column(length = 100) 
    private String middlename; 
    @Size(max = 100) 
    @Column(length = 100) 
    private String lastname; 
    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, fetch = FetchType.EAGER) 
    @JoinTable(name = "useradministration.usergroups", 
      joinColumns = { 
     @JoinColumn(name = "userid", referencedColumnName = "userid", nullable = false) 
    }, 
      inverseJoinColumns = { 
     @JoinColumn(name = "groupid", referencedColumnName = "groupid", nullable = false)}) 
    private List<Groups> groupsList; 


@Override 
public int hashCode() { 
    int hash = 0; 
    hash += (userid != null ? userid.hashCode() : 0); 
    return hash; 
} 

@Override 
public boolean equals(Object object) { 
    // TODO: Warning - this method won't work in the case the id fields are not set 
    if (!(object instanceof Users)) { 
     return false; 
    } 
    Users other = (Users) object; 
    if ((this.userid == null && other.userid != null) || (this.userid != null && !this.userid.equals(other.userid))) { 
     return false; 
    } 
    return true; 
} 

@Override 
public String toString() { 
    return "com.cell.user.Users[ userid=" + userid + " ]"; 
} 

組實體:

@Entity 
@Table(schema = "useradministration") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "Groups.findAll", query = "SELECT g FROM Groups g"), 
    @NamedQuery(name = "Groups.findByGroupid", query = "SELECT g FROM Groups g WHERE g.groupid = :groupid"), 
    @NamedQuery(name = "Groups.findByGroupname", query = "SELECT g FROM Groups g WHERE g.groupname = :groupname"), 
    @NamedQuery(name = "Groups.findByGroupdesc", query = "SELECT g FROM Groups g WHERE g.groupdesc = :groupdesc")}) 
public class Groups implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @SequenceGenerator(name = "useradministration.groups_groupid_seq", 
      sequenceName = "useradministration.groups_groupid_seq", 
      allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, 
      generator = "useradministration.groups_groupid_seq") 
    @Basic(optional = false) 
    @Column(nullable = false) 
    private Integer groupid; 
    @Size(max = 50) 
    @Column(length = 50) 
    private String groupname; 
    @Size(max = 200) 
    @Column(length = 200) 
    private String groupdesc; 
    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
    @JoinTable(name = "useradministration.usergroups", 
      joinColumns = { 
     @JoinColumn(name = "groupid", referencedColumnName = "groupid", nullable = false) 
    }, 
      inverseJoinColumns = { 
     @JoinColumn(name = "userid", referencedColumnName = "userid", nullable = false)}) 

    private List<Users> usersList; 


@Override 
public int hashCode() { 
    int hash = 0; 
    hash += (groupid != null ? groupid.hashCode() : 0); 
    return hash; 
} 

@Override 
public boolean equals(Object object) { 
    // TODO: Warning - this method won't work in the case the id fields are not set 
    if (!(object instanceof Groups)) { 
     return false; 
    } 
    Groups other = (Groups) object; 
    if ((this.groupid == null && other.groupid != null) || (this.groupid != null && !this.groupid.equals(other.groupid))) { 
     return false; 
    } 
    return true; 
} 

@Override 
public String toString() { 
    return "com.cell.user.Groups[ groupid=" + groupid + " ]"; 
} 

添加用戶代碼在UserController中:

public void addUser() { 
     List<Groups> groupList = new ArrayList<>(); 
     for (String s : usergroups) { 
      groupList.add(usercontrollerEJB.getGroup(Integer.parseInt(s))); 
     } 
     user.setGroupsList(groupList); 
     //hash some password here 
     String hashedPassword = Utility.hashPasswordSHABase64(user.getUserpassword()); 

     try { 
      // aeshedPassword = Utility.encrypt(hashedPassword, key); 
      // user.setUserpassword(aeshedPassword); 
      user.setUserpassword(hashedPassword); 
      usercontrollerEJB.addUser(user); 
      user = new Users(); 
      usergroups = new ArrayList<>(); 
     } catch (Exception ex) { 
      Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex); 
     } 


    } 

代碼在usercontrollerejb:

public void addUser(Users user) { 
     em.persist(user); 
    } 

當添加用戶與它正試圖插入到組表組:

INSERT INTO useradministration.GROUPS (GROUPID, GROUPDESC, GROUPNAME) VALUES (?, ?, ?) 
    bind => [1, Administration, Admin] 
+0

你在實體上實現了'equals'和'hashcode'方法嗎? –

+0

@KevinBowersox是的,我有。請參閱編輯。 – kinkajou

回答

0

當創建經由所述實體的JPA一側的關係必須被定義作爲自己的一方,然而在所提供的代碼中,似乎@ManyToMany的兩側已被表示爲關係的擁有方。關係的擁有方由標註@JoinColumn的位置表示。

嘗試修改Group實體使用mappedBy元素的@ManyToMany註釋:

public class Groups implements Serializable { 
     //omitted code 
     @ManyToMany(mappedBy="groupsList" cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
     private List<Users> usersList; 
     //omitted code 
} 

還記得,你是負責管理關係的雙方,如果您分配一個GroupListUser這意味着你還必須在GroupList上設置User

List<Groups> groupList = new ArrayList<>(); 
    for (String s : usergroups) { 
     groupList.add(usercontrollerEJB.getGroup(Integer.parseInt(s))); 
    } 
    groupList.getUserList().add(user); //add this 
    user.setGroupsList(groupList); 
+0

我也是這樣做的。它試圖將數據插入組表而不是用戶組表。當數據從用戶或組表中刪除時,我希望從用戶組中刪除數據。 – kinkajou

+0

我很困惑:當我刪除用戶時,它從用戶組表和用戶組表中刪除,但當我添加用戶時,它將添加到組表中而不是用戶組中。 – kinkajou

+0

@Kitex該組是否存在?如果沒有,則需要將其添加到用戶組。 –