SSH框架,action的scope设置为prototype一个奇怪问题,求解
我用SSH框架做权限管理时遇到一个奇怪问题:
用户表:T_USER
角色表:T_ROLE
菜单表:T_RESOURCE
角色用户表:T_USER_ROLE
角色资源表:T_ROLE_RESOURCE
我在修改角色时,如果Struts2的action 设置为@Scope("prototype")时,会删除角色用户表和角色资源表数据:
Hibernate: update T_ROLE set UPDATE_DATE=? where ID=?
Hibernate: delete from T_ROLE_RESOURCE where ROLE_ID=?
Hibernate: delete from T_USER_ROLE where ROLE_ID=?
如果去掉@Scope("prototype"),更新正常:
Hibernate: update T_ROLE set UPDATE_DATE=? where ID=?
角色表POJO如下:
@Entity
@org.hibernate.annotations.Entity(selectBeforeUpdate = true, dynamicInsert = true, dynamicUpdate = true)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name = "T_ROLE")
public class Role extends AuditModel implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID", nullable = false)
private Long id;
@Column(name = "NAME_ZH", length = 64, nullable = false)
private String nameZh;
@Column(name = "NAME_EN", length = 64, nullable = false)
private String nameEn;
@Column(name = "ROLE_CODE", length = 30, nullable = false)
private String roleCode;
@Column(name = "DESCRIPTION", length = 64)
private String description;
@ManyToMany(cascade = { CascadeType.MERGE }, fetch = FetchType.LAZY)
@JoinTable(name = "T_ROLE_RESOURCE", joinColumns = { @JoinColumn(name = "ROLE_ID") }, inverseJoinColumns = { @JoinColumn(name = "RESOURCE_ID") })
private Set<Resource> tsResources;
@ManyToMany(cascade = { CascadeType.MERGE }, fetch = FetchType.LAZY)
@JoinTable(name = "T_USER_ROLE", joinColumns = { @JoinColumn(name = "ROLE_ID") }, inverseJoinColumns = { @JoinColumn(name = "USER_ID") })
private Set<User> tsUsers = new HashSet<User>(0);
@Transient
private Boolean ischecked = false;
public Role() {
}
public Long getId() {
return this.id;
}
public String getNameZh() {
return nameZh;
}
public void setNameZh(String nameZh) {
this.nameZh = nameZh;
}
public String getNameEn() {
return nameEn;
}
public void setNameEn(String nameEn) {
this.nameEn = nameEn;
}
public String getRoleCode() {
return roleCode;
}
public void setRoleCode(String roleCode) {
this.roleCode = roleCode;
}
public String getDescription() {
return this.description;
}
public Set<Resource> getTsResources() {
return this.tsResources;
}
public void setTsResources(Set<Resource> tsResources) {
this.tsResources = tsResources;
}
public Set<User> getTsUsers() {
return this.tsUsers;
}
public void setDescription(String description) {
this.description = description;
}
public void setId(Long id) {
this.id = id;
}
public void setTsUsers(Set<User> tsUsers) {
this.tsUsers = tsUsers;
}
public Boolean getIschecked() {
return ischecked;
}
public void setIschecked(Boolean ischecked) {
this.ischecked = ischecked;
}
}