Hibernate使用property-ref属性解决遗留数据库One To Many关系的问题。

 
Hibernate使用property-ref属性解决遗留数据库One To Many关系的问题。
通常在我们现在的数据库设计父子关系时一般都是使用父表的主键(id)和子表的的一个外键(parentId)相关联。如:

<?xmlversion="1.0"?>

<!DOCTYPEhibernate-mappingPUBLIC

    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"

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

 
 

<hibernate-mappingpackage="hibernate.study.beans">

    <classname="Item"table="item">

       

        <cacheusage="read-write"/>

        <idname="id"type="java.lang.Integer"column="ITEM_ID">

            <generatorclass="native"/>

        </id>

       

        <timestampname="created"column="CREATED"/>

       

        <propertyname="itemName"type="java.lang.String"column="ITEM_NAME"not-null="true"length="45"/>

 
 

        <setname="bids"inverse="true"lazy="true"cascade="all-delete-orphan"batch-size="2">

            <cacheusage="read-write"/>

             <keycolumn="ITEM_ID"/>

             <one-to-manyclass="Bid"/>

        </set>

       

    </class>

</hibernate-mapping>

 
 

<?xmlversion="1.0"?>

<!DOCTYPEhibernate-mappingPUBLIC

    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"

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

 
 

<hibernate-mappingpackage="hibernate.study.beans">

    <classname="Bid"table="bid"batch-size="2">

        <cacheusage="read-write"/>

        <idname="id"type="java.lang.Integer"column="BID_ID">

            <generatorclass="native"/>

        </id>

 
 

       

        <propertyname="bidName"type="java.lang.String"column="BID_NAME"not-null="true"length="45"/>

 
 

        <many-to-onename="item"class="Item"column="ITEM_ID"not-null="true"/>

               

    </class>

</hibernate-mapping>

 
 
上面的Item和Bid是典型的One To Many 关系,而且我们使用One to Many双向关联也非常舒服。

 
 
在对FSI进行Hibernate的实现时遇到一个问题,主表不是用主键关联子表的外键,而是使用一个unique的外键去map子表。如:

 
 
CREATE TABLE `item_legacy` (
 `item_id` int(10) unsigned NOT NULL auto_increment,
 `item_name` varchar(45) NOT NULL default '',
 `child_id` int(10) unsigned default '0',
 PRIMARY KEY (`item_id`),
 UNIQUE KEY `child_id_unique` (`child_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 
 
CREATE TABLE `bid_legacy` (
 `bid_id` int(10) unsigned NOT NULL auto_increment,
 `bid_name` varchar(45) NOT NULL default '',
 `relation_id` int(10) unsigned NOT NULL default '0',
 PRIMARY KEY (`bid_id`),
 KEY `FK_bid_legacy_1` (`relation_id`),
 CONSTRAINT `FK_bid_legacy_1` FOREIGN KEY (`relation_id`) REFERENCES `item_legacy` (`child_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 
 
上面有两个表item_legacy, bid_legacy 他们是One To Many的关系,但是关联的是child_id-->relation_id.假如是这样的话,那么我们该怎样在Hibernate Mapping文件里配置呢?

 
 
当遇到这个问题的时候,我们觉得Hibernate应该可以解决这个问题,因为这个关联在遗留的数据库中应该是常见的,Hibernate的开发者应该会考虑到这种情况。上hiernate.org上面提问也没有人回答,下了班我跟一个同事一直在讨论这个问题,我们都坚信Hibernate会考虑这点的。经过多次尝试终于找到了解决方法。代码如下:

 
 

<hibernate-mappingpackage="hibernate3.study.beans">

    <classname="ItemLegacy"table="item_legacy">

       

        <idname="id"type="java.lang.Integer"column="item_id">

            <generatorclass="native"/>

        </id>

       

       

        <propertyname="itemName"type="java.lang.String"column="item_name"not-null="true"length="45"/>

 
 

        <propertyname="childId"type="java.lang.Integer"column="child_id"/>

           

        <setname="bids"inverse="true"lazy="true"cascade="all-delete-orphan"batch-size="2">

             <keycolumn="relation_id" property-ref="childId"/>

             <one-to-manyclass="BidLegacy"/>

        </set>

       

    </class>

</hibernate-mapping>

 
 

<hibernate-mappingpackage="hibernate3.study.beans">

    <classname="BidLegacy"table="bid_legacy">

       

        <idname="id"type="java.lang.Integer"column="bid_id">

            <generatorclass="native"/>

        </id>

       

       

        <propertyname="bidName"type="java.lang.String"column="bid_name"not-null="true"length="45"/>

 
 

        <many-to-onename="item"class="ItemLegacy"column="relation_id"property-ref="childId"not-null="true"/>

       

    </class>

</hibernate-mapping>

 
 

<keycolumn="relation_id"property-ref="childId"/>加上property-ref="childId"

在many-to-one 上也加上这句,这样这个问题就解决了。

 
 

在Hibernate2。18中 <key>中并没有property-ref这个属性。通过这次我加深了对Inverse属性的认识。感觉其实property-ref默认的是连到主表的ID上的。当我们把set中的主控方改为主表(ItemLegacy)时,我们可以去掉manytoone方的property-ref属性。这时发现当插入一个item(有一个child)是生成2个insert语句和一个update语句,其中插入child的语句中的relation_id对应item的主键,然后update语句把他更新为主表中的child_id。当把set中的主控方改为子表(BidLegacy inverse=true)时生成2条insert语句这时候子表会在插入前拿到主表的child_id,我想这就是称着为主控的原因。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值