如何将List <entity>复制到没有ID的新列表?

时间:2016-07-29 06:16:46

标签: java hibernate list

我有一些实体,例如User

class User{
 private Long id;
 private String Name;
 private List<Role> roles;
}

当我从DB获得此用户时,我有user = UserDao.getUser(1);

我有一些List<Role> someList;

我需要将user.getRoles()复制到someList

但如果我写user = user.getRoles() Role中的所有someList个对象的ID都不为空;

我想将someList设置为另一个用户,但如果ID不为空,我就无法使用它。

我可以做到这个

for (Role role: user.getRoles()) {
            role.setId(null);
            someList.add(role);
        }

但我认为这是不好的做法。也许你知道最好的方法吗?

2 个答案:

答案 0 :(得分:1)

假设您在一个事务中并且不想在不同用户之间重用Role个对象:使用hibernate的工作方式,您需要创建 new 角色对象,否则Hibernate会知道您将同一个实例分配给另一个对象,并且完全忽略您已将id设置为null。

就个人而言,我认为会在名为Role的{​​{1}}类中创建一个静态方法,它接收一个角色列表并实例化新角色(没有id)。

重要的一个重要问题是:您真的不想重复使用角色对象吗?并且可能有两个具有相同数据的角色,但只分配给不同的用户(可能违反第三范式......但这取决于您的要求)。

答案 1 :(得分:0)

这是一个例子。我自己组成了角色类,因为你没有提供它的任何源代码:

public class Role {
    private int id;
    private String someAttribute;
    private int otherAttribute;

    public Role(String someAttribute, int otherAttribute) {
        this.someAttribute = someAttribute;
        this.otherAttribute = otherAttribute;
    }

    // Other class methods omited for readability

    public Role clone() {
        return new Role(someAttribute, otherAttribute);
    }

}

编辑:你可以这样做你的循环:

for (Role role: user.getRoles()) {
    someList.add(role.clone());
}