今天下午在struts中写了个action,用来读取表单中一个二维表中的数据并通过Hibernate写到数据库中去。一运行发现只把表的最后一列存进去了。web页面我也改了、hibernate我也检查了,action我也仔细看了一遍,就是没有发现是什么问题。

         问题代码如下:

 
  
  1. //Saving participations for property[i]  
  2. comparisonParticipation = new ComparisonParticipation();  
  3. int len = itemList.size();  
  4. p = "p"+i;  
  5. for(int j = 1; j < len+1; j++){  
  6.     comparisonItem = (ComparisonItem)itemList.get(j-1);  
  7.     Long itemId = comparisonItem.getId();  
  8.     String q = "i"+j+p;  
  9.     String content = request.getParameter(q);  
  10.     comparisonParticipation.setPropertyId(propertyId);  
  11.     comparisonParticipation.setItemId(itemId);  
  12.     comparisonParticipation.setContent(content);  
  13.     cnService.persist(comparisonParticipation);  

 

         最终熬不住了出去走了一圈,回来才恍然大悟第五行开始的循环中用到的始终都是第二行创建的comparisonParticipation 对象,再循环中不管附几遍值,在数据库中存储的只是这一个对象,前边写的都被后边的覆盖了,所以才出现只保存了一行的问题。

         把comparisonParticipation 对象初始为null,再循环中用到的时候再new一下就是一个新的对象(见第10行),不会再存在后面的值覆盖前面值的问题,改正后的代码如下:

 
  
  1. //Saving participations for property[i]  
  2. comparisonParticipation = null;  
  3. int len = itemList.size();  
  4. p = "p"+i;  
  5. for(int j = 1; j < len+1; j++){  
  6.     comparisonItem = (ComparisonItem)itemList.get(j-1);  
  7.     Long itemId = comparisonItem.getId();  
  8.     String q = "i"+j+p;  
  9.     String content = request.getParameter(q);  
  10.     comparisonParticipation = new ComparisonParticipation();  
  11.     comparisonParticipation.setPropertyId(propertyId);  
  12.     comparisonParticipation.setItemId(itemId);  
  13.     comparisonParticipation.setContent(content);  
  14.     cnService.persist(comparisonParticipation);  

 

本人新手,高手勿笑,如果还有错误请指正,新手引以为戒……