使用两个列表和数据库放入 hashmap

put in hashmap using two lists and database

我有两个class,用户和客户,使用hibernate,我映射了这些table,现在我想从数据库中检索数据,我可以把值放在那里在 hashmap 中,对于每个用户,如果映射 table 中存在特定客户,则将映射的键设置为客户名称,并将值设置为 true 或 false,具体取决于映射 table .

我已经检索到两个列表:

static List<User> listUsers = new ArrayList<User>();
static List<Customer> listCustomers = new ArrayList<Customer>();
List<UserTO> list = new ArrayList<UserTO>();

public static List<Customer> getListOfCustomers() {
    HibernateUtil.openSession();
    Session session = HibernateUtil.getSession();
    Transaction tx = null;
    try {
        tx = session.getTransaction();
        tx.begin();
        listCustomers = session.createQuery("from Customer").list();
        tx.commit();
    } catch (Exception e) {
        if (tx != null) {
            tx.rollback();
        }
        e.printStackTrace();
    } finally {
        session.close();
    }
    return listCustomers;
}
(similarly list of users)

在 UserTO class 中,我有:

public class UserTO implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;

private String userId;
private Map<String, Boolean> map = new HashMap<String, Boolean>();
(getter and setter)

我试过这样做:

public static void execute() {
    getListOfUsers();
    getListOfCustomers();
    for (User user : listUsers) {
        UserTO u = new UserTO();
        Map<String, Boolean> map = new HashMap<>();
        for (Customer customer : listCustomers) {
            if (customer.getCompanyName() == user.getCustomers(customer)) {
                map.put(customer.getCompanyName(), true);
            } else {
                map.put(customer.getCompanyName(), false);
            }
        }
        user.getUserId();
        u.setUserId(user.getUserId());
        u.setMap(map);
        listUsers.add(user);
    }
}

这给了我并发修改异常 我不知道我哪里做错了,接下来我该怎么做。

ConcurrentModificationException 的原因是您在迭代时试图同时添加到列表中:

for (User user : listUsers) {
....
    listUsers.add(user);

解决此问题的一种方法是创建一个临时列表并继续向该列表添加内容,然后在 for 循环之后,使用 listUsers 上的 addAll 方法添加您添加的所有用户在循环中。

注意:为了 select 数据,您不需要交易,因为 select 不会对您的 table 产生任何副作用。

您收到并发修改异常,因为 HashMap 不是线程安全的。请改用 concurrentHashMap。谢谢希望对你有帮助。

当您迭代此列表用户时,您正在将用户添加到 listUsers。这会导致给定的异常。

使用list.add(u);

您要做的是从列表中获取 User 对象,然后再次将其添加到列表。它不会工作,原因如下:

  1. 您正在迭代列表并在不允许的同一循环中添加并抛出 ConcurrentModificationException.

  2. 你也在每次迭代中添加。这意味着列表将随着每次迭代而增长,并且您的循环将永远不会结束。首先,您应该删除该对象,然后再次将其添加到同一位置。

    解决方案:

    public static void execute() {
        getListOfUsers();
        getListOfCustomers();
        for (int i=0;i<listUsers.size();i++) {
            User user = listUsers.remove(i);
            UserTO u = new UserTO();
            Map<String, Boolean> map = new HashMap<>();
            for (Customer customer : listCustomers) {
                if (customer.getCompanyName() == user.getCustomers(customer)) {
                    map.put(customer.getCompanyName(), true);
                } else {
                    map.put(customer.getCompanyName(), false);
                }
            }
            user.getUserId();
            u.setUserId(user.getUserId());
            u.setMap(map);
            listUsers.add(i,user);
        }  
    }
    

P.S。 - 但我仍然不明白为什么需要添加一个已经存在于列表中的对象而不做任何更改。