关于hibernate的many to many(由one to many 与 many to one组成)关系

关于hibernate的many to many(由one to many 与 many to one组成) 关系
例如, 用户(User),角色(Role),以及用户—角色表(UserRole)这三张表
具体的po对应如下:
[code="java"]
package frery;

import java.util.HashSet;
import java.util.Set;

public class User implements java.io.Serializable {

private Integer uid;
private String uname;
private Set userroles = new HashSet(0);


public User() {
}

public User(Integer uid) {
    this.uid = uid;
}
public User(Integer uid, String uname, Set userroles) {
    this.uid = uid;
    this.uname = uname;
    this.userroles = userroles;
}

public Integer getUid() {
    return this.uid;
}

public void setUid(Integer uid) {
    this.uid = uid;
}

public String getUname() {
    return this.uname;
}

public void setUname(String uname) {
    this.uname = uname;
}

public Set getUserroles() {
    return this.userroles;
}

public void setUserroles(Set userroles) {
    this.userroles = userroles;
}

}

package frery;

import java.util.HashSet;
import java.util.Set;

public class Role implements java.io.Serializable {

private Integer rid;
private String rname;
private Set userroles = new HashSet(0);


public Role() {
}


public Role(Integer rid) {
    this.rid = rid;
}


public Role(Integer rid, String rname, Set userroles) {
    this.rid = rid;
    this.rname = rname;
    this.userroles = userroles;
}


public Integer getRid() {
    return this.rid;
}

public void setRid(Integer rid) {
    this.rid = rid;
}

public String getRname() {
    return this.rname;
}

public void setRname(String rname) {
    this.rname = rname;
}

public Set getUserroles() {
    return this.userroles;
}

public void setUserroles(Set userroles) {
    this.userroles = userroles;
}

}

package frery;

public class Userrole implements java.io.Serializable {

private Integer urid;
private Role role;
private User user;




public Userrole() {
}

public Userrole(Integer urid) {
    this.urid = urid;
}


public Userrole(Integer urid, Role role, User user) {
    this.urid = urid;
    this.role = role;
    this.user = user;
}



public Integer getUrid() {
    return this.urid;
}

public void setUrid(Integer urid) {
    this.urid = urid;
}

public Role getRole() {
    return this.role;
}

public void setRole(Role role) {
    this.role = role;
}

public User getUser() {
    return this.user;
}

public void setUser(User user) {
    this.user = user;
}

}
[/code]
我想通过对UserRole的持久化对象进行更新两者的关系
如 User user = userDao.getUserById(1) ;
Role role = roleDao.getRoleById(2) ;
Userrole userRole = new Userrole() ;
userRole.setUser(user) ;
userRole.setRole(role) ;
userroleDao.saveOrUpdate(userRole) ;
userroleDao.saveOrUpdate(userRole) ; //在这里我调用了两次saveOrUpdate,如何保证这条重复记录不被插入呢?

UserRole这个对象根本不需要。在User中这样写(使用的是JPA):
[code="java"]
private Set roles = new LinkedHashSet();

@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinTable(name = "USER_ROLE", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
@Fetch(FetchMode.SUBSELECT)
@OrderBy("id")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public Set getRoles() {
return roles;
}
[/code]

在Role中userroles去除。

保存User这样写:
[code="java"]
User user = new User();
user.setId(1L);
user.setName("用户A");

Role role = new Role();
role.setId(1L);
role.setName("角色A");

user.getRoles().add(role);

userDao.save(user);
[/code]