使用JPA添加行以连接表

时间:2010-11-11 19:29:40

标签: jpa join insert jpa-2.0

我正在使用JPA 2.0,而且我正在使用生成的架构。

这是我的映射:

@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在Join Table FRIENDSHIP中添加新行。

我真的很感激任何帮助。

2 个答案:

答案 0 :(得分: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();

友谊关系是(自引用)双向关联,因此您必须正确设置链接的两端(从user1到user2以及从user2到user1)。

答案 1 :(得分:0)

提供维护参照完整性的公共添加/删除可能会更加优雅。