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"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.netqin.function.osuproduct.product.model.OsuProduct" table="TBL_OSU_PRODUCT_I" schema="OSU_WORK">
<id name="id" type="long">
<column name="PRDU_ID" precision="10" scale="0" />
<generator class="sequence">
<param name="sequence">SEQ_OSU_PRODUCT_I</param>
</generator>
</id>
<property name="prduName" type="string">
<column name="PRDU_NAME" length="200" not-null="true" />
</property>
<property name="prduDescription" type="string">
<column name="PRDU_DESCRIPTION" length="200" />
</property>


<set name="productMessage" cascade="all-delete-orphan" inverse="true" lazy="false">
<key column="PRME_PRDUID_FK"/>
<one-to-many class="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"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.netqin.function.osuproduct.productmessage.model.ProductMessage" table="TBL_OSU_PRODUCTMESSAGE_I" schema="OSU_WORK">
<id name="prmeId" type="java.lang.Long">
<column name="PRME_ID" precision="10" scale="0" />
<generator class="sequence">
<param name="sequence">SEQ_OSU_PRODUCTMESSAGE_I</param>
</generator>
</id>

<property name="prmeMecoidFk" type="java.lang.Long">
<column name="PRME_MECOID_FK" precision="10" scale="0" not-null="true" />
</property>

<many-to-one name="product"
class="com.netqin.function.osuproduct.product.model.OsuProduct">
<column name="PRME_PRDUID_FK" />
</many-to-one>


</class>
</hibernate-mapping>

说明:配置比较简单。

二。使用方法

主表操控子表方法:

1.新增:

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

//提示语
if(messageContentId!=null&&messageContentId.length>0){
for(int i=0;i<messageContentId.length;i++){
ProductMessage pm = new ProductMessage();
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(int i=0;i<messageContentId.length;i++){
ProductMessage pm = new ProductMessage();
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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值