Struts2 修改信息 Collection对象丢失??

用户对象:
[code="java"]
@Entity
public class User {
private Integer userid;
private String username;
private String password;
private int sex;
private int age;
private int befrom;

private Set<Role> roles = new HashSet<Role>();

//省略get、set方法
//......

}
[/code]

有一个编辑用户信息的页面userEdit.jsp,用户可以修改username,set,age,befrom,password信息,roles不会在这里被修改,因此页面也没有相应的input或其他控件与它对应,这样保存后,roles就丢失了。怎么办呢?是搞个隐藏域放roles吗?!

[b]
不好意思,写错地方了。应该是update方法[/b]

[code="java"] //新增或保存
public String doSave() {
if (null == user.getUserid()) {

           // 然后再添加
    userService.addUser(user);
    } else {
           // 根据Userid查询 roles列表
           // 数据库操作
           user.setRoles(roles);
    userService.updateUser(user);
    }
    return SUCCESS;
} [/code]

你的Aciton中的信息如何?

当然不用搞隐藏域放roles,你可以先把roles放在request中,
request.setAttribute("roles",roles);

当修改后提交到修改action后,再从请求中取出roles就好了

[b]Actino中你新建了一个 User[/b]
[code="java"]
private User user=new User(); [/code]
[b]
User构造函数中,你构造了个空的 roles:[/b]

[code="java"]private Set roles = new HashSet(); [/code]
[b]
当然为空了。。。[/b]

还有action的配置要是type="dispatcher"才行

[b]
问题就出在你的UserAction的设计上,(这句代码):[/b]

[code="java"]private User user=new User(); [/code]
[b]
[color=blue]解释: Struts2中的Action是 Prototype的,即每次请求,都生成一个Action的实例。

所以,你请求SaveAction,准备调用doSave方法前,一个新的UserAction实例已经被创建了。
而在创建的过程中,新建了个User,且User的roles为空。恰恰,你没做任何处理,就保存了这个空的对象。[/color]
[/b]

[b]
最简单的方法:

在修改信息的jsp中,将roles的信息,显示在表单中。

然后在doSave中处理。[/b]

你把你的action调用流程描述一下先

你可以这样:

public class UserAction extends ActionSupport implements SessionAware {

@Resource
private UserService userService;

private User user=new User();

// ..........

//新增或保存
public String doSave() {
    if (null == user.getUserid()) {   
           // 根据Userid查询 roles列表
           // 数据库操作
           user.setRoles(roles);

           // 然后再添加
        userService.addUser(user);
    } else {
        userService.updateUser(user);
    }
    return SUCCESS;
}

// ...........

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

}

[b]
你只需修改doSave的方法,在添加前,先查询roles信息,然后修改新建user的roles,最后再加入数据中。[/b]

[code="java"]//新增或保存
public String doSave() {
if (null == user.getUserid()) {

// 根据Userid查询 roles列表
// 数据库操作
user.setRoles(roles);

           // 然后再添加
    userService.addUser(user);
    } else {
    userService.updateUser(user);
    }
    return SUCCESS;
} [/code]