【问题标题】:put in hashmap using two lists and database使用两个列表和数据库放入 hashmap
【发布时间】:2016-04-26 04:55:39
【问题描述】:

我有两个类,用户和客户,使用休眠,我已经映射了这些表,现在我想从数据库中检索数据,我可以将值放在哈希图中,这样对于每个用户,如果特定客户存在于映射表中,则map的key为客户名,value为true或false,取决于映射表。

我已经检索了两个列表:

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 类中,我有:

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);
    }
}

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

【问题讨论】:

    标签: java hibernate mapping many-to-many


    【解决方案1】:

    您在迭代此 listuser 时将用户添加到 listUsers。这会导致给定的异常。

    使用 list.add(u);

    【讨论】:

      【解决方案2】:

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

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

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

      注意:为了选择数据,您不需要事务,因为 select 不会对您的表格产生任何副作用。

      【讨论】:

        【解决方案3】:

        您尝试做的是从列表中获取 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);
              }  
          }
          

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

        【讨论】:

        • 我必须这样做:list.add(u);我做错了。谢谢
        • 乐于助人。如果答案对您有帮助,您应该投票赞成,如果它解决了您的问题,则应将其标记为正确。无论如何......快乐的编码...... :)
        【解决方案4】:

        由于 HashMap 不是线程安全的,您会遇到并发修改异常。改用 concurrentHashMap 。谢谢希望对你有帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-11
          • 1970-01-01
          • 2012-08-15
          • 2019-04-10
          • 1970-01-01
          • 2021-04-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多