Hibernate使用property-ref属性解决遗留数据库One To Many关系的问题。
2005-08-26 09:47
776 查看
Hibernate使用property-ref属性解决遗留数据库One To Many关系的问题。通常在我们现在的数据库设计父子关系时一般都是使用父表的主键(id)和子表的的一个外键(parentId)相关联。如:<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping package="hibernate.study.beans">
<class name="Item" table="item">
<cache usage="read-write"/>
<id name="id" type="java.lang.Integer" column="ITEM_ID">
<generator class="native"/>
</id>
<timestamp name="created" column="CREATED" />
<property name="itemName" type="java.lang.String" column="ITEM_NAME" not-null="true" length="45"/>
<set name="bids" inverse="true" lazy="true" cascade="all-delete-orphan" batch-size="2">
<cache usage="read-write"/>
<key column="ITEM_ID"/>
<one-to-many class="Bid"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping package="hibernate.study.beans">
<class name="Bid" table="bid" batch-size="2">
<cache usage="read-write"/>
<id name="id" type="java.lang.Integer" column="BID_ID">
<generator class="native"/>
</id>
<property name="bidName" type="java.lang.String" column="BID_NAME" not-null="true" length="45"/>
<many-to-one name="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-mapping package="hibernate3.study.beans">
<class name="ItemLegacy" table="item_legacy">
<id name="id" type="java.lang.Integer" column="item_id">
<generator class="native"/>
</id>
<property name="itemName" type="java.lang.String" column="item_name" not-null="true" length="45"/>
<property name="childId" type="java.lang.Integer" column="child_id" />
<set name="bids" inverse="true" lazy="true" cascade="all-delete-orphan" batch-size="2">
<key column="relation_id" property-ref="childId"/>
<one-to-many class="BidLegacy"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping package="hibernate3.study.beans">
<class name="BidLegacy" table="bid_legacy">
<id name="id" type="java.lang.Integer" column="bid_id">
<generator class="native"/>
</id>
<property name="bidName" type="java.lang.String" column="bid_name" not-null="true" length="45"/>
<many-to-one name="item" class="ItemLegacy" column="relation_id" property-ref="childId" not-null="true"/>
</class>
</hibernate-mapping>
在<key column="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,我想这就是称着为主控的原因。
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping package="hibernate.study.beans">
<class name="Item" table="item">
<cache usage="read-write"/>
<id name="id" type="java.lang.Integer" column="ITEM_ID">
<generator class="native"/>
</id>
<timestamp name="created" column="CREATED" />
<property name="itemName" type="java.lang.String" column="ITEM_NAME" not-null="true" length="45"/>
<set name="bids" inverse="true" lazy="true" cascade="all-delete-orphan" batch-size="2">
<cache usage="read-write"/>
<key column="ITEM_ID"/>
<one-to-many class="Bid"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping package="hibernate.study.beans">
<class name="Bid" table="bid" batch-size="2">
<cache usage="read-write"/>
<id name="id" type="java.lang.Integer" column="BID_ID">
<generator class="native"/>
</id>
<property name="bidName" type="java.lang.String" column="BID_NAME" not-null="true" length="45"/>
<many-to-one name="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-mapping package="hibernate3.study.beans">
<class name="ItemLegacy" table="item_legacy">
<id name="id" type="java.lang.Integer" column="item_id">
<generator class="native"/>
</id>
<property name="itemName" type="java.lang.String" column="item_name" not-null="true" length="45"/>
<property name="childId" type="java.lang.Integer" column="child_id" />
<set name="bids" inverse="true" lazy="true" cascade="all-delete-orphan" batch-size="2">
<key column="relation_id" property-ref="childId"/>
<one-to-many class="BidLegacy"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping package="hibernate3.study.beans">
<class name="BidLegacy" table="bid_legacy">
<id name="id" type="java.lang.Integer" column="bid_id">
<generator class="native"/>
</id>
<property name="bidName" type="java.lang.String" column="bid_name" not-null="true" length="45"/>
<many-to-one name="item" class="ItemLegacy" column="relation_id" property-ref="childId" not-null="true"/>
</class>
</hibernate-mapping>
在<key column="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,我想这就是称着为主控的原因。
相关文章推荐
- Hibernate使用property-ref属性解决遗留数据库One To Many关系的问题。
- Hibernate中property-ref的使用,常用来解决遗留数据库One To Many关系
- 解决Hibernate 注解在属性上 ,多对一,一对一懒加载 当调用one那一方getId 也会查数据库的问题
- [转]Hibernate中property-ref的应用,常用来解决遗留数据库One To Many关系
- 解决问题(十)——HashCodeBuilder在one-to-many关系中出现Lazy异常
- 关于hibernate中双向外键关联one-to-one的property-ref=的问题
- 关于hibernate中双向外键关联one-to-one的property-ref=的问题(转)
- 关于hibernate中双向外键关联one-to-one的property-ref=的问题
- 关于hibernate中双向外键关联one-to-one的property-ref=的问题
- 解决Hibernate 注解在属性上 ,多对一,一对一懒加载 当调用one那一方getId 也会查数据库的问题
- Hibernate 表关系描述之OneToMany
- Hibernate 、多表关联映射-多对一关系(many-to-one)
- Hibernate中ManyToOne,OneToMany,OneToOne的使用例
- JPA 、 @ManyToOne、@OneToMany 外键 关联 设置关联项为NULL的问题完美解决
- Hibernate注解中的manytomany级联与不级联删除问题的解决
- hibernate映射文件one-to-many元素属性
- WebLogic下开发Hibernate问题 java.lang.NoSuchMethodError:javax.persistence.OneToMany.orphanRemoval()Z
- Hibernate 中annotations(注解开发)的@OneToMany 一对多双向关联映射后,出现的jar包冲突问题
- hibernate的many-to-one的级联删除问题
- Hibernate one-to-many && many-to-many 的关系映射