困扰了我两天的问题,有这么个需求
产品跟产品的计量单位是1对多的关系,要求在新增产品的时候,顺便把这个产品的多个计量单位也保存到数据库产品modelpublic class ProductModel
{
    private Integer productid;
    private String productno;
    private String productname;
    private List<ProductUnitModel> productunits = new ArrayList();
        // set get 方法略}产品计量单位model
public class ProductUnitModel
{
    private Integer productunitid;
    private String productunitname;
    private BigDecimal productunitre;
    //set get 方法略
}ProductModel 的hibernate配置文件 就是 一对多 “一”的那一方
<hibernate-mapping package="com.dfgg.sms.model">
<class name="ProductModel" table="DPC_Product">
<id name="productid" column="product_id"  type="java.lang.Integer">
  <generator class="identity"></generator>
</id>
<property name="productno" column="product_no" type="java.lang.String"></property>
<property name="productname" column="product_name" type="java.lang.String"></property>

<list name="productunits" table="DPC_ProductUnit" cascade="save-update">
<key column="product_id" not-null="true"></key>
<index column="productunit_idx" type="java.lang.Integer"></index>
<one-to-many class="com.dfgg.sms.model.ProductUnitModel"></one-to-many>
</list>
</class>
</hibernate-mapping>struts2当中的action
product action
public class ProductAction extends ActionSupport
{
    private ProductModel product;
         //set get 方法略
}新增产品的jsp页面,我做了一个动态添加表格行
<tr><td><input name="product.productunits[0].productunitname"><input name="product.productunits[0].productunitre"></td><tr>
<tr><td><input name="product.productunits[1].productunitname"><input name="product.productunits[1].productunitre"></td><tr>
<tr><td><input name="product.productunits[2].productunitname"><input name="product.productunits[2].productunitre"></td><tr>
<tr><td><input name="product.productunits[3].productunitname"><input name="product.productunits[3].productunitre"></td><tr>
<tr><td><input name="product.productunits[4].productunitname"><input name="product.productunits[4].productunitre"></td><tr>
如果用户看到写错了,还可以在删除这个行,
<tr><td><input name="product.productunits[0].productunitname"><input name="product.productunits[0].productunitre"></td><tr>
<tr><td><input name="product.productunits[1].productunitname"><input name="product.productunits[1].productunitre"></td><tr>
<tr><td><input name="product.productunits[2].productunitname"><input name="product.productunits[2].productunitre"></td><tr>
<tr><td><input name="product.productunits[4].productunitname"><input name="product.productunits[4].productunitre"></td><tr>删除之后,这个list的索引就不按0 1 2 3 4这么排列了。导致我用hibernate存到数据库中是,这个list的索引字段顺序被打乱  如下图我再在修改产品的页面用el表达式循环输出这个产品对应的多个计量单位的时候,hibernate从数据库是按索引给我读出,明明只有0 1 2 4 这么4条数据,hibernate会给我读出5条数据,分别是0 1 2 3 4 ,3是空。这样我在页面上循环显示的时候就有个空我该怎么办啊

解决方案 »

  1.   

    用set代替list,我估计List是有序的,如果3没有它自己会自动填充吧
      

  2.   

    试过set,但struts2 对set支持不好。另外最主要的是我需要保留数据顺序的。
      

  3.   

    那可能就要人工操作了,在action里先遍历list?设置个断点看下值?然后操作?
    当然你也可以自己写个标签专门迭代类似的list
      

  4.   

    但是我目前没有更好的办法这个涉及到他查询产生LIST的机制,当然,如果你愿意的话也可以覆盖框架给你提供的方法,但是估计层次会有点深而且也没必要专门为了一个方法的返回值去改底层源码。我个人觉得还是用标签好了其实也不用太纠结,直接山寨core标签,+个判断。就好了。
      

  5.   

    还有个办法,就是你自己写一个List集合的子类,然后在该类中提供去空值的方法。我是黔驴技穷了祝你早日得到结果
      

  6.   

    hibernate 还有这问题?好久没用过了。学习。实在不行,只能页面判断了。希望有更好的办法,顶出高手
      

  7.   

    我基本上都用annotation了,xml格式的基本不咋用了
      

  8.   

    hibernate从数据库是按索引给我读出,明明只有0 1 2 4 这么4条数据,hibernate会给我读出5条数据怎么个按索引读出法?总共才4条记录 返回个list 在页面遍历不就行了
      

  9.   

    能不能把DAO和Service相关的操作代码贴出来?