论坛首页 Java企业应用论坛

如何实现父子关系的自动插入,one-to-many好像不能够自动插入...

浏览 3522 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2003-12-05  
比如我有一张销售单(SaleBillPO),销售单有多个销售项(SaleItemPO)
在SaleBillPO中有一个SaleItemPO的List.同时在SaleItemPO中有一
个表示该销售项所属的销售单(saleBill)
目前的配置情况如下:
在SaleBill.hbm.xml中如下配置
        
       <list
            name="saleItem"
            lazy="true"
            inverse="true"
            cascade="all"
        >

              <key
                  column="saleID"
              />

			<index column="itemOrder" />
              <one-to-many
                  class="com.lenovo.shanzb.SHDemo.model.bean.SaleItemPO"/>
        </list>

同时在SaleItem.hbm.xml中配置的情况如下:
          <many-to-one
            name="saleBill"
			column="saleID"
			class="com.lenovo.shanzb.SHDemo.model.bean.SaleBillPO"			
            cascade="none"
			update="false"
			insert="true"
        /> 


但是在操作的时候我新增加了一张销售单,同时为该销售单创建了几个销售项
然后调用一个销售单的DAO保存该销售单,在Mysql数据库中销售单的结果保存
了,但是销售项却没有保存任何信息.调用的代码如下:
        DAOFactory df = DAOFactory.getInstance(); ;
        SaleBillDAO saleBillDAO = df.getSaleBillDAO();;
        SaleItemPO saleItem = new SaleItemPO();;
        saleItem.setItemID("SI00004");;
        saleItem.setAcount(new Integer(100););;
        //saleItem.setSaleID("SB00002");;
        SaleBillPO saleBill = new SaleBillPO();;
        saleBill.setSaleID("SB00003");;
        saleBill.setSaleDesc("我的第三个销售单");;
        saleBill.setSaleName("我的销售单");;
        saleItem.setSaleBill(saleBill);;
        saleBill.addSaleItem(saleItem);;

        try
        {
            saleBillDAO.addSaleBill(saleBill);;

        }
        catch ( HibernateException ex );
        {
            ex.printStackTrace(System.out); ;
        }

    }



但是值得说明一下的是,我在保存SaleItem的时候,如果检查到销售单没有
新建则会自动插入销售单的数据.
不知道以上代码有什么问题,请各位大侠帮帮忙看看.
多谢多谢
   发表时间:2003-12-05  
映射有严重问题,list是不能简单地设为inverse="true"的,这样谁来负责维护<index column="itemOrder" />,必须在SaleItemPO中为column itemOrder映射一个属性,且程序必须这样
saleItem.setSaleBill(saleBill);; 
saleBill.addSaleItem(saleItem);; 

//设置saleItem在saleBill.saleItems中的index
saleItem.setItemOrder(saleBill.getSaleItems();.getSize();-1);;        


引用

我在保存SaleItem的时候,如果检查到销售单没有
新建则会自动插入销售单的数据.

你如何判断的?
0 请登录后投票
   发表时间:2003-12-05  
one-to-many以前已经讨论过n遍了问题了,提问之前先搜索一下。

你的代码问题在于你add item之前要先save一下bill,因为bill是一个new出来的对象,不是一个已经被持久化过的对象,对它进行add item,Hibernate并不能够检查到它的状态。对于one-to-many,一般都是如下操作:

Parent一端设置inverse="true"

Parent p = new Parent();;

p.set...;
p.set...;

session.save(p);;

Child c1 = new Child();;
c1.set...;
p.add(c1);;

Child c2= new Child();;
c2.set...;
p.add(c2);;

session.flush();;
tx.commit();;
0 请登录后投票
   发表时间:2004-01-13  
我想问yehs220你说的必须在SaleItemPO中为column itemOrder映射一个属性,那么这个映射属性应该如何写呢,谢谢了,我现在正需要这个答案
0 请登录后投票
   发表时间:2004-01-14  
<property name="itemOrder" type="int"/>


----------------------------------------------------------------
saleBill.addSaleItem(saleItem);; 

saleItem.setSaleBill(saleBill);; 
//设置saleItem在saleBill.saleItems中的index 
saleItem.setItemOrder(saleBill.getSaleItems();.getSize();-1);;  

session.save(saleBill);;
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics