`

Hibernate 3.2 学习笔记 映射实体关联关系

 
阅读更多

映射实体关联关系

一 映射 一对一
组件类是没有OID没有对应的表 生命周期也依赖于其他的对象

两种方法
1 按照外键映射
2 按照主键映射

1 按照外键映射

定义一个或多个外键 参照 其他表的主键
例子
Customer和Address
Customer.hbm.xml

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

<hibernate-mapping>

<classname="ergal.Customer"table="CUSTOMERS"lazy="true">
<idname="id"type="long"column="ID">
<generatorclass="native"/>
</id>

<propertyname="name"column="NAME"type="string"/>

<many-to-onename="homeAddress"
column
="HOME_ADDRESS_ID"
class
="ergal.Address"
casecade
="all"
unique
="true"/>

<many-to-onename="comAddress"
column
="COM_ADDRESS_ID"
class
="ergal.Address"
casecade
="all"
unique
="true"/>

</class>

</hibernate-mapping>

其中unique="true" 表明每个 Customer只有唯一的Address

Address.hbm.xml

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

<hibernate-mapping>

<classname="ergal.Address"table="ADDRESSES"lazy="true">
<idname="id"type="long"column="ID">
<generatorclass="native"/>
</id>

<propertyname="city"column="CITY"type="string"/>
<propertyname="province"column="PROVINCE"type="string"/>
<propertyname="street"column="STREET"type="string"/>
<propertyname="zipcode"column="ZIPCODE"type="string"/>

<one-to-onename="customer"
class
="ergal.Address"
property-ref
="homeAddress"/>

</class>

</hibernate-mapping>

其中property-ref 表明建立了从homeAddress和Customer的关联

注意:
这里one-to-one只能用一次 所以不能同时让homeAddress和comAddress都和Customer双向关联
可以用继承的方式来解决这种映射的不足

2 按照主键映射
一方的ID字段几既是主键 也作为外键参照是另一方的主键

适用范围这种方式是只是纯粹的一对一 只存在一个表的一个字段对应另一个表

例子
Customer和Address
Customer.hbm.xml

Customer.hbm.xml

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

<hibernate-mapping>

<classname="ergal.Customer"table="CUSTOMERS"lazy="true">
<idname="id"type="long"column="ID">
<generatorclass="native"/>
</id>

<propertyname="name"column="NAME"type="string"/>

<one-to-onename="address"
class
="ergal.Address"
casecade
="all"/>


</class>

</hibernate-mapping>

Address.hbm.xml

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

<hibernate-mapping>

<classname="ergal.Address"table="ADDRESSES"lazy="true">
<idname="id"type="long"column="ID">
<generatorclass="foreign">
<paramname="property">customer</param>
</generator>
</id>

<propertyname="city"column="CITY"type="string"/>
<propertyname="province"column="PROVINCE"type="string"/>
<propertyname="street"column="STREET"type="string"/>
<propertyname="zipcode"column="ZIPCODE"type="string"/>

<one-to-onename="customer"
class
="ergal.Customer"
constrained
="true"/>

</class>

</hibernate-mapping>

这里的id有点不一样 和Customer共享 所以 要用foreign
而且要添加<param name="property">customer</param>元素

在one-to-one中 有constrained属性表明主键同时作为外键参照 Customer表

二 映射 单向多对多

例子
Category和Item多对多
现在只允许Category导航到Item
Category.hbm.xml

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

<hibernate-mapping>

<classname="ergal.Category"table="CATEGORIES"lazy="true">
<idname="id"type="long"column="ID">
<generatorclass="native"/>
</id>

<propertyname="name"column="NAME"type="string"/>

<setname="items"table="CATEGORY_ITEM"lazy="true"cascade="save-update">
<keycolumn="CATEGORY_ID"/>
<many-to-manyclass="ergal.Item"column="ITEM_ID"/>
</set>

</class>

</hibernate-mapping>

这里会多一个表用来做另外两个表的参照
用联合主键 两个字段分别作为外键参照两个表的主键

Item.hbm.xml

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

<hibernate-mapping>

<classname="ergal.Item"table="ITEMS"lazy="true">
<idname="id"type="long"column="ID">
<generatorclass="native"/>
</id>

<propertyname="name"column="NAME"type="string"/>

<propertyname="basePrice"column="BASE_PRICE"type="double"/>

</class>

</hibernate-mapping>

hbm2ddl
会有3个表产生
CATEGORIES
1 - ID
2 - NAME
CATEGORY_ITEM
1 - CATEGORY_ID
2 - ITEM_ID
ITEM
1 - ID
2 - NAME
3 - BASE_PRICE

测试代码
BusinessService.java

packageergal;

importjava.util.*;
importorg.hibernate.*;
importorg.hibernate.cfg.*;
importjava.sql.*;

publicclassBusinessService
...{
publicstaticSessionFactorysessionFactory;
static
...{
try
...{
Configurationconfig
=newConfiguration();
sessionFactory
=config.configure().buildSessionFactory();
}

catch(Exceptione)
...{
e.printStackTrace();
}

}


publicvoidsaveCategory(Categorycategory)throwsException
...{
Sessionsession
=sessionFactory.openSession();
Transactiontx
=null;
try
...{
tx
=session.beginTransaction();
session.save(category);
tx.commit();
}

catch(Exceptione)
...{
if(tx!=null)
...{
tx.rollback();
}

throwe;
}

finally
...{
session.close();
}

}


publicCategoryloadCategory(Longid)throwsException
...{
Sessionsession
=sessionFactory.openSession();
Transactiontx
=null;
try
...{
tx
=session.beginTransaction();
Categorycategory
=(Category)session.load(Category.class,id);
Hibernate.initialize(category.getItems());
tx.commit();

returncategory;
}

catch(Exceptione)
...{
if(tx!=null)
...{
tx.rollback();
}

throwe;
}

finally
...{
session.close();
}

}


publicvoidprintCategory(Categorycategory)throwsException
...{
Setitems
=category.getItems();
Iteratorit
=items.iterator();
while(it.hasNext())
...{
Itemitem
=(Item)it.next();
System.out.println(category.getName()
+""+item.getName()+""+item.getBasePrice());
}

}


publicvoidtest()throwsException
...{
Itemitem1
=newItem("Nokia6610",3200);
Itemitem2
=newItem("Nokia3230",2400);
Itemitem3
=newItem("ATIX1600",1500);
Itemitem4
=newItem("Novida6800GT",1600);

Categorycategory1
=newCategory();
category1.setName(
"Moblie");
category1.getItems().add(item1);
category1.getItems().add(item2);

Categorycategory2
=newCategory();
category2.setName(
"Displaycard");
category2.getItems().add(item3);
category2.getItems().add(item4);

Categorycategory3
=newCategory();
category3.setName(
"Nokiaseries");
category3.getItems().add(item1);
category3.getItems().add(item2);

saveCategory(category1);
saveCategory(category2);
saveCategory(category3);

Categoryc1
=loadCategory(newLong(1));
printCategory(c1);
Categoryc2
=loadCategory(newLong(2));
printCategory(c2);
Categoryc3
=loadCategory(newLong(3));
printCategory(c3);
}


publicstaticvoidmain(String[]args)throwsException
...{
System.out.println(
"----------------teststart---------------");
newBusinessService().test();
sessionFactory.close();
System.out.println(
"----------------testend---------------");
}

}

结果

[java]----------------teststart---------------
[java]Hibernate:insertintoCATEGORIES(NAME)values(?)
[java]Hibernate:insertintoITEMS(NAME,BASE_PRICE)values(?,?)
[java]Hibernate:insertintoITEMS(NAME,BASE_PRICE)values(?,?)
[java]Hibernate:insertintoCATEGORY_ITEM(CATEGORY_ID,ITEM_ID)values(
?,?)
[java]Hibernate:insertintoCATEGORY_ITEM(CATEGORY_ID,ITEM_ID)values(
?,?)
[java]Hibernate:insertintoCATEGORIES(NAME)values(?)
[java]Hibernate:insertintoITEMS(NAME,BASE_PRICE)values(?,?)
[java]Hibernate:insertintoITEMS(NAME,BASE_PRICE)values(?,?)
[java]Hibernate:insertintoCATEGORY_ITEM(CATEGORY_ID,ITEM_ID)values(
?,?)
[java]Hibernate:insertintoCATEGORY_ITEM(CATEGORY_ID,ITEM_ID)values(
?,?)
[java]Hibernate:insertintoCATEGORIES(NAME)values(?)
[java]Hibernate:updateITEMSsetNAME=?,BASE_PRICE=?whereID=?
[java]Hibernate:updateITEMSsetNAME=?,BASE_PRICE=?whereID=?
[java]Hibernate:insertintoCATEGORY_ITEM(CATEGORY_ID,ITEM_ID)values(
?,?)
[java]Hibernate:insertintoCATEGORY_ITEM(CATEGORY_ID,ITEM_ID)values(
?,?)
[java]Hibernate:selectcategory0_.IDasID0_0_,category0_.NAMEasNAME0_
0_fromCATEGORIEScategory0_wherecategory0_.ID=?
[java]Hibernate:selectitems0_.CATEGORY_IDasCATEGORY1_1_,items0_.ITEM_
IDasITEM2_1_,item1_.IDasID2_0_,item1_.NAMEasNAME2_0_,item1_.BASE_PRICE
asBASE3_2_0_fromCATEGORY_ITEMitems0_leftouterjoinITEMSitem1_onitems0_
.ITEM_ID=item1_.IDwhereitems0_.CATEGORY_ID=?
[java]MoblieNokia66103200.0
[java]MoblieNokia32302400.0
[java]Hibernate:selectcategory0_.IDasID0_0_,category0_.NAMEasNAME0_
0_fromCATEGORIEScategory0_wherecategory0_.ID=?
[java]Hibernate:selectitems0_.CATEGORY_IDasCATEGORY1_1_,items0_.ITEM_
IDasITEM2_1_,item1_.IDasID2_0_,item1_.NAMEasNAME2_0_,item1_.BASE_PRICE
asBASE3_2_0_fromCATEGORY_ITEMitems0_leftouterjoinITEMSitem1_onitems0_
.ITEM_ID=item1_.IDwhereitems0_.CATEGORY_ID=?
[java]DisplaycardNovida6800GT1600.0
[java]DisplaycardATIX16001500.0
[java]Hibernate:selectcategory0_.IDasID0_0_,category0_.NAMEasNAME0_
0_fromCATEGORIEScategory0_wherecategory0_.ID=?
[java]Hibernate:selectitems0_.CATEGORY_IDasCATEGORY1_1_,items0_.ITEM_
IDasITEM2_1_,item1_.IDasID2_0_,item1_.NAMEasNAME2_0_,item1_.BASE_PRICE
asBASE3_2_0_fromCATEGORY_ITEMitems0_leftouterjoinITEMSitem1_onitems0_
.ITEM_ID=item1_.IDwhereitems0_.CATEGORY_ID=?
[java]NokiaseriesNokia66103200.0
[java]NokiaseriesNokia32302400.0
[java]02:09:05,875INFOSessionFactoryImpl:767-closing
[java]----------------testend---------------

这里也可以根据储存的元素是否有重复 排序 检索的策略等等选择其他的集合类型 如:<idbag> <list> <map>
具体参照集合映射

三 映射 双向多对多


必须把一方的inverse设置为true 两端都可以使用<set>元素
inverse属性为false的一方可以用<idbag> <list> <map>
inverse属性为true的一方可以用<idbag>


1 两端使用<set>元素

例子同上

Category和Item多对多
现在只允许Category导航到Item
Category.hbm.xml
不变

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

<hibernate-mapping>

<classname="ergal.Category"table="CATEGORIES"lazy="true">
<idname="id"type="long"column="ID">
<generatorclass="native"/>
</id>

<propertyname="name"column="NAME"type="string"/>

<setname="items"table="CATEGORY_ITEM"lazy="true"cascade="save-update">
<keycolumn="CATEGORY_ID"/>
<many-to-manyclass="ergal.Item"column="ITEM_ID"/>
</set>

</class>

</hibernate-mapping>

Item.hbm.xml

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

<hibernate-mapping>

<classname="ergal.Item"table="ITEMS"lazy="true">
<idname="id"type="long"column="ID">
<generatorclass="native"/>
</id>

<propertyname="name"column="NAME"type="string"/>

<propertyname="basePrice"column="BASE_PRICE"type="double"/>

<setname="categories"table="CATEGORY_ITEM"
lazy
="true"
inverse
="true"
cascade
="save-update">
<keycolumn="ITEM_ID"/>
<many-to-manyclass="ergal.Category"column="CATEGORY_ID"/>
</set>

</class>

</hibernate-mapping>

添加了set元素
hbm2ddl产生的表和单向时时一样的
可以根据需要修改Item的构造函数
测试为了演示 这种双向关联的 两种导航都时可以的
测试代码 可以这么写

Itemitem1=newItem("Nokia6610",3200);
Itemitem2
=newItem("Nokia3230",2400);
Itemitem3
=newItem("ATIX1600",1500);
Itemitem4
=newItem("Novida6800GT",1600);

Categorycategory1
=newCategory();
category1.setName(
"Moblie");
category1.getItems().add(item1);
category1.getItems().add(item2);

item1.getCategories().add(category1);
item2.getCategories().add(category1);

Categorycategory2
=newCategory();
category2.setName(
"Displaycard");
category2.getItems().add(item3);
category2.getItems().add(item4);

item3.getCategories().add(category2);
item4.getCategories().add(category2);

Categorycategory3
=newCategory();
category3.setName(
"Nokiaseries");
category3.getItems().add(item1);
category3.getItems().add(item2);

item1.getCategories().add(category3);
item2.getCategories().add(category3);

saveCategory(category1);
saveCategory(category2);
saveCategory(category3);


Categoryc1
=loadCategory(newLong(1));
printCategory(c1);
Categoryc2
=loadCategory(newLong(3));
printCategory(c2);
Categoryc3
=loadCategory(newLong(4));
printCategory(c3);

注意
Category的Id在 执行第三个操作的时候被更新了
就是在把item1和item2导航到第三个Category时 他的ID变了
原来的ID不能导航到他的 items了
所以修改了ID的 数字才能正确查找到Nokia Series
虽然在数据库中的ID 2 仍然为Nokia Series 但是已经无法导航到正确的Items了

结果为

[java]----------------teststart---------------
[java]Hibernate:selectcategory0_.IDasID0_0_,category0_.NAMEasNAME0_
0_fromCATEGORIEScategory0_wherecategory0_.ID=?
[java]Hibernate:selectitems0_.CATEGORY_IDasCATEGORY1_1_,items0_.ITEM_
IDasITEM2_1_,item1_.IDasID2_0_,item1_.NAMEasNAME2_0_,item1_.BASE_PRICE
asBASE3_2_0_fromCATEGORY_ITEMitems0_leftouterjoinITEMSitem1_onitems0_
.ITEM_ID=item1_.IDwhereitems0_.CATEGORY_ID=?
[java]MoblieNokia32302400.0
[java]MoblieNokia66103200.0
[java]Hibernate:selectcategory0_.IDasID0_0_,category0_.NAMEasNAME0_
0_fromCATEGORIEScategory0_wherecategory0_.ID=?
[java]Hibernate:selectitems0_.CATEGORY_IDasCATEGORY1_1_,items0_.ITEM_
IDasITEM2_1_,item1_.IDasID2_0_,item1_.NAMEasNAME2_0_,item1_.BASE_PRICE
asBASE3_2_0_fromCATEGORY_ITEMitems0_leftouterjoinITEMSitem1_onitems0_
.ITEM_ID=item1_.IDwhereitems0_.CATEGORY_ID=?
[java]DisplaycardATIX16001500.0
[java]DisplaycardNovida6800GT1600.0
[java]Hibernate:selectcategory0_.IDasID0_0_,category0_.NAMEasNAME0_
0_fromCATEGORIEScategory0_wherecategory0_.ID=?
[java]Hibernate:selectitems0_.CATEGORY_IDasCATEGORY1_1_,items0_.ITEM_
IDasITEM2_1_,item1_.IDasID2_0_,item1_.NAMEasNAME2_0_,item1_.BASE_PRICE
asBASE3_2_0_fromCATEGORY_ITEMitems0_leftouterjoinITEMSitem1_onitems0_
.ITEM_ID=item1_.IDwhereitems0_.CATEGORY_ID=?
[java]NokiaseriesNokia32302400.0
[java]NokiaseriesNokia66103200.0
[java]03:18:11,125INFOSessionFactoryImpl:767-closing
[java]----------------testend---------------

inverse属性为false的一方可以用<idbag> <list> <map>
inverse属性为true的一方可以用<idbag>
不做详细的演示了
可能都会存在或多或少的这种意想不到的差异

映射一对多关联关系

在关系型数据库中 只存在外键参照关系 总是由many方参照one方 所以关系型数据库只支持多对一或者一对一的单向关联

<many-to-one>建立一对多单向关联
内嵌的以下属性
' name 设定持久化类的属性名
' column 设定和持久化类对应的表的外键
' class 设定持久化类的属性
' not-null 不允许为空
' cascade
当取值为 save-update时 表示级联保存更新与他相关联的对象
当取值为none时 Hibernate删除一个对象的时候不会级联删除与他相关联的对象
当取值为delete的时候才会级联删除
当取值为all-delete-orphan时会
' 当保存或更新对象时级联保存或更新相关联的的对象相当于save-update
' 当删除对象时会级联删除相关联的对象相当于delete
' 删除不再和one方相关联的所有many方对象

<set>建立一对多双向关联
属性
' name 映射持久化类的属性名
' cascade 当取值为 save-update时 表示级联保存更新与他相关联的对象
当取值为 delete时 表示级联删除更新与他相关联的对象
' inverse 属性 如果为true
表明在双向关联中 one的一方只是many一方的关联的镜像 当Hibernate检测到两方的状态均发生变化的时候 就会仅仅按照many方来同步更新数据库
这样做可以提高应用的性能
注意两点:
one方的属性inverse 因该设置为true
最好同时修改两方的属性
like this:
order.setCustomer(customer);
customer.getOrders().add(order);

当接触双方关系的时候也要一起删除
like this
order.setCustomer(null);
customer.getOrders().remove(order);

<key column=> 通过的表的外键参照
<one-to-many class=> 表明里面放的是一组class对象

Hibernate会自动清理缓存中的所有持久化对象,按照持久化对象状态的改变来改变同步更新数据库

Hibernate 的一对多自身关联

在同一个类也可以自身一对多关联
如下

Category.hbm.xml

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>


<hibernate-mapping>

<classname="ergal.Category"table="CATEGORIES"lazy="true">
<idname="id"type="long"column="ID">
<generatorclass="increment"/>
</id>

<propertyname="name"type="string">
<columnname="NAME"length="15"/>
</property>
<set
name="childCategories"
cascade
="save-update"
inverse
="true"
>
<keycolumn="CATEGORY_ID"/>
<one-to-manyclass="ergal.Category"/>
</set>

<many-to-one
name="parentCategory"
column
="CATEGORY_ID"
class
="ergal.Category"
/>
</class>
</hibernate-mapping>

但是在在数据表类的CATEGORY_ID只是表现parentCategory的
换句话说就是还是和以前一样many方的<many-to-one>在表中有实体

另外在论坛中有人告诉我说
1. the "find X as x" syntax is deprecated. Use "find X x" instead.
2. Don't build query strings like that. Use positional or named parameters. This is better:

Listresults=session.createQuery("fromCategorywherename=:name").setString("name",name).list();

所以查询语句这么写更好

publicCategoryfindCategoryByName(Sessionsession,Stringname)throwsException
...{
Categoryc
=newCategory();
Listresults
=session.createQuery("fromCategorywherename=:name").setString("name",name).list();
Iteratorit
=results.iterator();
while(it.hasNext())
...{
c
=(Category)it.next();
}

returnc;
}

映射组成关系

通过域模型(由程序代码组成)细化持久化类 提高代码的可重用性

<component>组件
属性:
name 持久化类的属性名
class 类名
元素:
<parent> 指定所属的整体类
<property> 内部的属性

值类型 和 实体类型
值类型没有OID 不能被单独持久化 实体类可以单独持久化

' 当程序持久化组件的所属类的时候 组件类会自动持久化 Hibernate是不允许单独持久化组件类的
' 组件可以嵌套 可以关联其他持久化类 其他持久化类不能关联它

例子
Computer.hbm.xml

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

<hibernate-mapping>

<classname="ergal.Computer"table="COMPUTERS"lazy="true">
<idname="id"type="long"column="ID">
<generatorclass="increment"/>
</id>

<propertyname="name"type="string">
<columnname="NAME"length="15"/>
</property>

<componentname="cpuBox"class="ergal.CpuBox">
<parentname="computer"/>
<propertyname="type"type="string">
<columnname="CPUBOX_TYPE"length="15"/>
</property>

<componentname="graphicsCard"class="ergal.GraphicsCard">
<parentname="cpuBox"/>
<propertyname="type"type="string">
<columnname="GRAPHICSCARD_TYPE"length="15"/>
</property>
</component>

<many-to-one
name="vendor"
column
="CPUBOX_VENDOR_ID"
class
="ergal.Vendor"
not-null
="true"
/>
</component>

</class>
</hibernate-mapping>
Vendor.hbm.xml
<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

<hibernate-mapping>

<classname="ergal.Vendor"table="VENDORS"lazy="true">
<idname="id"type="long"column="ID">
<generatorclass="increment"/>
</id>

<propertyname="name"type="string">
<columnname="NAME"length="15"/>
</property>

</class>
</hibernate-mapping>

Customer.hbm.xml

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

<hibernate-mapping>

<classname="ergal.Customer"table="CUSTOMERS"lazy="true">
<idname="id"type="long"column="ID">
<generatorclass="increment"/>
</id>

<propertyname="name"type="string">
<columnname="NAME"length="15"/>
</property>

<componentname="homeAddress"class="ergal.Address">
<parentname="customer"/>
<propertyname="province"type="string"column="HOME_PROVINCE"/>
<propertyname="city"type="string"column="HOME_CITY"/>
<propertyname="street"type="string"column="HOME_STREET"/>
<propertyname="zipcode"type="string"column="HOME_ZIPCODE"/>
</component>

<componentname="comAddress"class="ergal.Address">
<parentname="customer"/>
<propertyname="province"type="string"column="COM_PROVINCE"/>
<propertyname="city"type="string"column="COM_CITY"/>
<propertyname="street"type="string"column="COM_STREET"/>
<propertyname="zipcode"type="string"column="COM_ZIPCODE"/>
</component>
</class>
</hibernate-mapping>

运行hbm2java
工具会产生六个类
Address.java

packageergal;
//Generated2006-8-1817:26:10byHibernateTools3.2.0.beta6a



/***//**
*Addressgeneratedbyhbm2java
*/

publicclassAddressimplementsjava.io.Serializable...{

//Fields

privateStringprovince;
privateStringcity;
privateStringstreet;
privateStringzipcode;

//Constructors

/***//**defaultconstructor*/
publicAddress()...{
}


/***//**fullconstructor*/
publicAddress(Stringprovince,Stringcity,Stringstreet,Stringzipcode)...{
this.province=province;
this.city=city;
this.street=street;
this.zipcode=zipcode;
}



//Propertyaccessors
publicStringgetProvince()...{
returnthis.province;
}


publicvoidsetProvince(Stringprovince)...{
this.province=province;
}

publicStringgetCity()...{
returnthis.city;
}


publicvoidsetCity(Stringcity)...{
this.city=city;
}

publicStringgetStreet()...{
returnthis.street;
}


publicvoidsetStreet(Stringstreet)...{
this.street=street;
}

publicStringgetZipcode()...{
returnthis.zipcode;
}


publicvoidsetZipcode(Stringzipcode)...{
this.zipcode=zipcode;
}


}

Computer.java

packageergal;
//Generated2006-8-1817:26:10byHibernateTools3.2.0.beta6a



/***//**
*Computergeneratedbyhbm2java
*/

publicclassComputerimplementsjava.io.Serializable...{

//Fields

privatelongid;
privateStringname;
privateCpuBoxcpuBox;

//Constructors

/***//**defaultconstructor*/
publicComputer()...{
}


/***//**minimalconstructor*/
publicComputer(CpuBoxcpuBox)...{
this.cpuBox=cpuBox;
}

/***//**fullconstructor*/
publicComputer(Stringname,CpuBoxcpuBox)...{
this.name=name;
this.cpuBox=cpuBox;
}



//Propertyaccessors
publiclonggetId()...{
returnthis.id;
}


publicvoidsetId(longid)...{
this.id=id;
}

publicStringgetName()...{
returnthis.name;
}


publicvoidsetName(Stringname)...{
this.name=name;
}

publicCpuBoxgetCpuBox()...{
returnthis.cpuBox;
}


publicvoidsetCpuBox(CpuBoxcpuBox)...{
this.cpuBox=cpuBox;
}



}

CpuBox.java

packageergal;
//Generated2006-8-1817:26:10byHibernateTools3.2.0.beta6a



/***//**
*CpuBoxgeneratedbyhbm2java
*/

publicclassCpuBoximplementsjava.io.Serializable...{

//Fields

privateStringtype;
privateGraphicsCardgraphicsCard;
privateVendorvendor;

//Constructors

/***//**defaultconstructor*/
publicCpuBox()...{
}


/***//**minimalconstructor*/
publicCpuBox(Vendorvendor)...{
this.vendor=vendor;
}

/***//**fullconstructor*/
publicCpuBox(Stringtype,GraphicsCardgraphicsCard,Vendorvendor)...{
this.type=type;
this.graphicsCard=graphicsCard;
this.vendor=vendor;
}



//Propertyaccessors
publicStringgetType()...{
returnthis.type;
}


publicvoidsetType(Stringtype)...{
this.type=type;
}

publicGraphicsCardgetGraphicsCard()...{
returnthis.graphicsCard;
}


publicvoidsetGraphicsCard(GraphicsCardgraphicsCard)...{
this.graphicsCard=graphicsCard;
}

publicVendorgetVendor()...{
returnthis.vendor;
}


publicvoidsetVendor(Vendorvendor)...{
this.vendor=vendor;
}

}
Customer.java
packageergal;
//Generated2006-8-1817:26:10byHibernateTools3.2.0.beta6a



/***//**
*Customergeneratedbyhbm2java
*/

publicclassCustomerimplementsjava.io.Serializable...{

//Fields

privatelongid;
privateStringname;
privateAddresshomeAddress;
privateAddresscomAddress;

//Constructors

/***//**defaultconstructor*/
publicCustomer()...{
}


/***//**fullconstructor*/
publicCustomer(Stringname,AddresshomeAddress,AddresscomAddress)...{
this.name=name;
this.homeAddress=homeAddress;
this.comAddress=comAddress;
}



//Propertyaccessors
publiclonggetId()...{
returnthis.id;
}


publicvoidsetId(longid)...{
this.id=id;
}

publicStringgetName()...{
returnthis.name;
}


publicvoidsetName(Stringname)...{
this.name=name;
}

publicAddressgetHomeAddress()...{
returnthis.homeAddress;
}


publicvoidsetHomeAddress(AddresshomeAddress)...{
this.homeAddress=homeAddress;
}

publicAddressgetComAddress()...{
returnthis.comAddress;
}


publicvoidsetComAddress(AddresscomAddress)...{
this.comAddress=comAddress;
}


}

GraphicsCard.java

packageergal;
//Generated2006-8-1817:26:10byHibernateTools3.2.0.beta6a



/***//**
*GraphicsCardgeneratedbyhbm2java
*/

publicclassGraphicsCardimplementsjava.io.Serializable...{

//Fields

privateStringtype;

//Constructors

/***//**defaultconstructor*/
publicGraphicsCard()...{
}


/***//**fullconstructor*/
publicGraphicsCard(Stringtype)...{
this.type=type;
}



//Propertyaccessors
publicStringgetType()...{
returnthis.type;
}


publicvoidsetType(Stringtype)...{
this.type=type;
}


}

Vendor.java

packageergal;
//Generated2006-8-1817:26:10byHibernateTools3.2.0.beta6a



/***//**
*Vendorgeneratedbyhbm2java
*/

publicclassVendorimplementsjava.io.Serializable...{

//Fields

privatelongid;
privateStringname;

//Constructors

/***//**defaultconstructor*/
publicVendor()...{
}


/***//**fullconstructor*/
publicVendor(Stringname)...{
this.name=name;
}



//Propertyaccessors
publiclonggetId()...{
returnthis.id;
}


publicvoidsetId(longid)...{
this.id=id;
}

publicStringgetName()...{
returnthis.name;
}


publicvoidsetName(Stringname)...{
this.name=name;
}


}

运行hbm2ddl
生成以下ddl

createtableCOMPUTERS(
IDbigintnotnull,
NAMEvarchar(15),
CPUBOX_TYPEvarchar(15),
GRAPHICSCARD_TYPEvarchar(15),
CPUBOX_VENDOR_IDbigintnotnull,
primarykey(ID));
createtableCUSTOMERS(
IDbigintnotnull,
NAMEvarchar(15),
HOME_PROVINCEvarchar(255),
HOME_CITYvarchar(255),
HOME_STREETvarchar(255),
HOME_ZIPCODEvarchar(255),
COM_PROVINCEvarchar(255),
COM_CITYvarchar(255),
COM_STREETvarchar(255),
COM_ZIPCODEvarchar(255),
primarykey(ID));
createtableVENDORS(
IDbigintnotnull,
NAMEvarchar(15),
primarykey(ID));
altertableCOMPUTERS
addindexFK52FE749856F75DC7(CPUBOX_VENDOR_ID),
addconstraintFK52FE749856F75DC7foreignkey(CPUBOX_VENDOR_ID)referencesVENDORS(ID);
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics