qq_21762063 2009-12-10 14:08
浏览 242
已采纳

关于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,如何保证这条重复记录不被插入呢?

  • 写回答

1条回答 默认 最新

  • 紫翎观星 2009-12-10 16:43
    关注

    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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大