2010-11-11 48 views
2

我正在使用JPA 2.0,並且正在使用生成的模式。使用JPA添加行以連接表使用JPA

這裏是我的映射:

@Entity 
@Table(name = "CBV_USER") 
public class CbvUser implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "Login") 
    private String login; 

    @Basic(optional = false) 
    @Column(name = "Password") 
    private String password; 

    @Basic(optional = false) 
    @Column(name = "Email") 
    private String email; 

    @Basic(optional = false) 
    @Column(name = "FirstName") 
    private String firstName; 

    @Basic(optional = false) 
    @Column(name = "LastName") 
    private String lastName; 

    @Basic(optional = false) 
    @Column(name = "Id") 
    private String id; 

    @Column(name = "Score") 
    private BigDecimal score; 

    @JoinTable(name = "FRIENDSHIP", joinColumns = { 
     @JoinColumn(name = "Login0", referencedColumnName = "Login")}, inverseJoinColumns = { 
     @JoinColumn(name = "Login1", referencedColumnName = "Login")}) 
    @ManyToMany 
    private List<CbvUser> cbvUserList2; 

    @ManyToMany(mappedBy = "cbvUserList2") 
    private List<CbvUser> cbvUserList3; 

    public CbvUser() { 
    } 

    public CbvUser(String login) { 
     this.login = login; 
    } 

    public CbvUser(String login, String password, String email, String firstName, String lastName, String id) { 
     this.login = login; 
     this.password = password; 
     this.email = email; 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.id = id; 
    } 

    public String getLogin() { 
     return login; 
    } 

    public void setLogin(String login) { 
     this.login = login; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public BigDecimal getScore() { 
     return score; 
    } 

    public void setScore(BigDecimal score) { 
     this.score = score; 
    } 

    public List<CbvUser> getCbvUserList2() { 
     return cbvUserList2; 
    } 

    public void setCbvUserList2(List<CbvUser> cbvUserList2) { 
     this.cbvUserList2 = cbvUserList2; 
    } 

    public List<CbvUser> getCbvUserList3() { 
     return cbvUserList3; 
    } 

    public void setCbvUserList3(List<CbvUser> cbvUserList3) { 
     this.cbvUserList3 = cbvUserList3; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (login != null ? login.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 CbvUser)) { 
      return false; 
     } 
     CbvUser other = (CbvUser) object; 
     if ((this.login == null && other.login != null) || (this.login != null && !this.login.equals(other.login))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "models.CbvUser[login=" + login + "]"; 
    } 

} 

我的問題是,我無法弄清楚如何在連接表的友誼特定CbvUser或通過一個EntityManager添加一個新行。

我會很感激任何幫助。

回答

2

像這樣的東西應該工作:

CbvUser user1 = new CbvUser(); 
... 
CbvUser user2 = new CbvUser(); 
... 

// declare user2 as a friend of user1 
List<CbvUser> cbvUserList2 = new ArrayList<CbvUser>(); 
cbvUserList2.add(user2); 
user1.setCbvUserList2(cbvUserList2); 

// declare user1 as a friend of user2 
List<CbvUser> cbvUserList3 = new ArrayList<CbvUser>(); 
cbvUserList3.add(user1); 
user2.setCbvUserList3(cbvUserList3); 

em.persist(user1); 
em.persist(user2); 
em.flush(); 

的友誼關係是(自引用)雙向關聯,所以你必須正確設置鏈路的兩端(從用戶1到用戶2和用戶2爲user1 )。

+0

是的,謝謝。昨天我在這個頁面上找到了一個類似的解決方案,可以很好地工作:http://www.winstonprakash.com/articles/netbeans/JPA_Add_Update_Delete.html – mgvaldes 2010-11-12 16:02:38

0

提供一個公共的添加/刪除維護參照完整性可能會更優雅。