Hibernate级联实践之二(many-to-one)

一。mapping

这里使用两张表,分别是TBL_OSU_PRODUCT_I和TBL_OSU_PRODUCTMESSAGE_I,前者与后者是一对多的关系,映射文件如下:

1.TBL_OSU_PRODUCT_I

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<classname="com.netqin.function.osuproduct.product.model.OsuProduct"table="TBL_OSU_PRODUCT_I"schema="OSU_WORK">

<idname="id"type="long">

<columnname="PRDU_ID"precision="10"scale="0"/>

<generatorclass="sequence">

<paramname="sequence">SEQ_OSU_PRODUCT_I</param>

</generator>

</id>

<propertyname="prduName"type="string">

<columnname="PRDU_NAME"length="200"not-null="true"/>

</property>

<propertyname="prduDescription"type="string">

<columnname="PRDU_DESCRIPTION"length="200"/>

</property>

<setname="productMessage"cascade="all-delete-orphan"inverse="true"lazy="false">

<keycolumn="PRME_PRDUID_FK"/>

<one-to-manyclass="com.netqin.function.osuproduct.productmessage.model.ProductMessage"/>

</set>

</class>

</hibernate-mapping>

说明:cascade="all-delete-orphan":级联删除、修改和更新; inverse="true":控制权交给对方,既新增或修改时,ProductMessage需要明确指定对OsuProduct的关联;

lazy="false":一并加载子表,方便页面展示(该属性可以根据实际情况制定);<key column="PRME_PRDUID_FK"/> :子表中关联主表的字段名称

2.TBL_OSU_PRODUCTMESSAGE_I

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<classname="com.netqin.function.osuproduct.productmessage.model.ProductMessage"table="TBL_OSU_PRODUCTMESSAGE_I"schema="OSU_WORK">

<idname="prmeId"type="java.lang.Long">

<columnname="PRME_ID"precision="10"scale="0"/>

<generatorclass="sequence">

<paramname="sequence">SEQ_OSU_PRODUCTMESSAGE_I</param>

</generator>

</id>

<property name="prmeMecoidFk" type="java.lang.Long">

<columnname="PRME_MECOID_FK"precision="10"scale="0"not-null="true"/>

</property>

<many-to-onename="product"

class="com.netqin.function.osuproduct.product.model.OsuProduct">

<columnname="PRME_PRDUID_FK"/>

</many-to-one>

</class>

</hibernate-mapping>

说明:配置比较简单。

二。使用方法

主表操控子表方法:

1.新增:

String[] messageContentId = request.getParameterValues("messageContentId");//提示语主题ID

//提示语

if(messageContentId!=null&&messageContentId.length>0){

for(inti=0;i<messageContentId.length;i++){

ProductMessagepm=newProductMessage();

pm.setPrmeMecoidFk(Long.parseLong(messageContentId[i]));

pm.setProduct(object);//因为是inverse="true",所以需要子表指定主表对象

object.getProductMessage().add(pm);//这个步骤不能省,否则不能级联保存子表

}

}

dao.save(object);//object为主表对象,可以通过new得到

2.修改:

OsuProduct object_tem = this.findById(object.getId());//从数据库中取到主表对象

object_tem.getProductMessage().removeAll(object_tem.getProductMessage());//清空提示语,先清空在添加

String[] messageContentId = request.getParameterValues("messageContentId");//提示语主题ID

//提示语

if(messageContentId!=null&&messageContentId.length>0){

for(inti=0;i<messageContentId.length;i++){

ProductMessagepm=newProductMessage();

pm.setPrmeMecoidFk(Long.parseLong(messageContentId[i]));

pm.setProduct(object_tem);

object_tem.getProductMessage().add(pm);

}

}

//将页面传递过来的数据copy到持久对象中copyProject(object_tem, object);

dao.update(object_tem);//关于主表的其余属性的修改可以应用一个copy方法

copy方法:

private void copyProject(OsuProduct dest, OsuProduct sour) {

dest.setPrduDescription(sour.getPrduDescription());//描述

}

3.删除

删除主表即可

dao.delete(object);

相关推荐