Java 使用两个列表和数据库放入hashmap
我有两个类,User和Customer,使用hibernate,我映射了这些表,现在我想从数据库中检索数据,我可以将值放入hashmap中,这样对于每个用户,如果映射表中存在特定的客户,那么map的键设置为客户名称,值设置为true或false,取决于映射表 我已检索到两个列表:Java 使用两个列表和数据库放入hashmap,java,hibernate,mapping,many-to-many,Java,Hibernate,Mapping,Many To Many,我有两个类,User和Customer,使用hibernate,我映射了这些表,现在我想从数据库中检索数据,我可以将值放入hashmap中,这样对于每个用户,如果映射表中存在特定的客户,那么map的键设置为客户名称,值设置为true或false,取决于映射表 我已检索到两个列表: static List<User> listUsers = new ArrayList<User>(); static List<Customer> listCustomers =
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)
static List listUsers=new ArrayList();
静态列表listCustomers=new ArrayList();
列表=新的ArrayList();
公共静态列表getListOfCustomers(){
HibernateUtil.openSession();
Session Session=HibernateUtil.getSession();
事务tx=null;
试一试{
tx=session.getTransaction();
tx.begin();
listCustomers=session.createQuery(“来自客户”).list();
tx.commit();
}捕获(例外e){
如果(tx!=null){
tx.回滚();
}
e、 printStackTrace();
}最后{
session.close();
}
退回客户名单;
}
(用户列表)
在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类UserTO实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@生成值
私人长id;
私有字符串用户标识;
私有映射映射=新的HashMap();
(盖特和塞特)
我试着这样做:
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);
}
}
publicstaticvoidexecute(){
getListOfUsers();
getListOfCustomers();
for(用户:listUsers){
UserTO u=新的UserTO();
Map Map=newhashmap();
对于(客户:列表客户){
if(customer.getCompanyName()==user.getCustomers(customer)){
map.put(customer.getCompanyName(),true);
}否则{
map.put(customer.getCompanyName(),false);
}
}
getUserId();
u、 setUserId(user.getUserId());
u、 setMap(map);
添加(用户);
}
}
这给了我并发修改异常
我不知道我哪里做错了,下一步该怎么办。原因是当您进行迭代时,您试图同时添加到列表中,如下所示:
for (User user : listUsers) {
....
listUsers.add(user);
解决此问题的一种方法是创建一个临时列表并不断添加到该列表中,在for循环之后,使用listUsers
上的addAll
方法添加在循环中添加的所有用户
注意:为了选择数据,您不需要事务,因为select不会对您的表产生任何副作用。原因是您试图在迭代的同时添加到列表中,如:
for (User user : listUsers) {
....
listUsers.add(user);
解决此问题的一种方法是创建一个临时列表并不断添加到该列表中,在for循环之后,使用listUsers
上的addAll
方法添加在循环中添加的所有用户
注意:为了选择数据,您不需要事务,因为select不会对您的表产生任何副作用。您将获得并发修改异常,因为HashMap不是线程安全的。请改用concurrentHashMap。感谢您的帮助。您将获得并发修改异常,因为HashMap不是线程安全的。请使用震荡请改为rrentHashMap。谢谢,希望能有所帮助。当您迭代此listuser时,正在将用户添加到listUsers。这将导致给定的异常
使用list.add(u);在迭代此listuser时,您正在将用户添加到listUsers。这将导致给定的异常
使用list.add(u);您试图做的是从列表中获取一个User对象,然后再次将其添加到列表中。它不起作用,原因如下:
publicstaticvoidexecute(){
getListOfUsers();
getListOfCustomers();
对于(int i=0;i您试图做的是从列表中获取一个用户对象,然后再次将其添加到列表中。由于以下原因,它无法工作:
您正在迭代列表并添加到不允许的同一循环中,并抛出ConcurrentModificationException
此外,您还在每次迭代中添加。这意味着列表将随着每次迭代而增长,循环将永远不会结束。首先,您应该删除对象,然后再次将其添加到相同的位置
解决方案:
publicstaticvoidexecute(){
getListOfUsers();
getListOfCustomers();
对于(int i=0;我必须这样做:list.add(u);我做错了。感谢您乐于帮助。如果答案对您有帮助,您应该对其进行投票,或者如果它解决了您的问题,您应该将其标记为正确。总之…happy coding…)我必须这样做:list.add(u);我做错了。谢谢你乐于帮助。如果答案对你有帮助,你应该投票表决,如果它解决了你的问题,你应该把它标记为正确。无论如何……快乐编码……)