User Role userRole

条件说明:在用户注册时候,选择role,然后再插入到数据库表中的user和user_role表中。

    下面实体配置中的cascade=CascadeType.MERGE,当删除某个user的时候,它同样也会级联的删除与其相关联的表中的数据。而只需要在后台用User user = this.getJpaTemplate().find(User.class, id);  this.getJpaTemplate().remove(user);这样就可以轻松的搞定级联删除了。

1.User实体
@Entity
@Table(name = "user")
public class User implements Serializable {
  @ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.MERGE)
    @JoinTable(name="user_role",
        joinColumns=
            @JoinColumn(name="user_id", referencedColumnName="ID"),
        inverseJoinColumns=
            @JoinColumn(name="role_id", referencedColumnName="ID")
        )
    private Set<Role> roleCollection = new HashSet<Role>();
}

 

2.Role实体
@Entity
@Table(name = "role")
public class Role implements Serializable {
  @ManyToMany(mappedBy="roleCollection")
   private Set<User> userCollection;
}

 

这样设置好实体后,逻辑代码是:

public String signupSubmit(){
  role = roleService.getRoleById(roleId);
  user.getRoleCollection().add(role);
  userService.insert(user);
  return "signupSubmit".trim();
}

这样就可以插入到user和user_role表中了。注意这里不用设置中间表的实体了,不管它任何事情。 

 

 

下面是错误的实体写法(它和中间表有关系了,最好不要这样写)

User实体(不支持的写法)
@Entity
@Table(name = "user")
public class User implements Serializable {
              private Set<UserRole> userRoles = new HashSet<UserRole>(0);
	
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user")
	public Set<UserRole> getUserRoles() {
		return this.userRoles;
	}

	public void setUserRoles(Set<UserRole> userRoles) {
		this.userRoles = userRoles;
	}
}

 

Role实体:(不支持的写法)
@Entity
@Table(name = "role")
public class Role implements Serializable {
              private Set<UserRole> userRoles = new HashSet<UserRole>(0);
	
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "role")
	public Set<UserRole> getUserRoles() {
		return this.userRoles;
	}

	public void setUserRoles(Set<UserRole> userRoles) {
		this.userRoles = userRoles;
	}
}

 

UserRole实体:
@Entity
@Table(name = "user_role")
public class UserRole implements java.io.Serializable {
                private User user;
	private Role role;
               @ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "user_id")
	public User getUser() {
		return this.user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "role_id")
	public Role getRole() {
		return this.role;
	}

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

 如果按照上面那种“不支持的写法”写了后,你不妨试下下面的代码或许能插入成功。

role = roleService.getRoleById(roleId);
UserRole userRole = new UserRole();
userRole.setRole(role);
userRole.setUser(user);
Set<UserRole> userRoles = new HashSet<UserRole>();
userRoles.add(userRole);
user.setUserRoles(userRoles);
userService.insert(user);

      如果插入成功则证明这样也是可以的,因为我的总是插入不成功(但是我同事的好像这样就可以插入成功,我至今都不知道是什么原因),可以是实体或者数据库或者其他的原因。 我的总报告错误是:During synchronization a new object was found through a relationship that was not marked cascade PERSIST。望高手指点!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值