- 浏览: 21672533 次
- 性别:
- 来自: 杭州
最新评论
-
ZY199266:
配置文件还需要额外的配置ma
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
ZY199266:
我的一访问为什么是 /mavenwebdemo/WEB-I ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
lvgaga:
我又一个问题就是 如果像你的这种形式写。配置文件还需要额外的 ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
lvgaga:
我的一访问为什么是 /mavenwebdemo/WEB-I ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
y1210251848:
你的那个错误应该是项目所使用的目标框架不支持吧
log4net配置(web中使用log4net,把web.config放在单独的文件中)
Hibernate 3.2 学习笔记 映射实体关联关系
映射实体关联关系
一 映射 一对一
组件类是没有OID没有对应的表 生命周期也依赖于其他的对象
两种方法
1 按照外键映射
2 按照主键映射
1 按照外键映射
定义一个或多个外键 参照 其他表的主键
例子
Customer和Address
Customer.hbm.xml
<!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
<!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
<!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
<!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
<!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
<!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
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]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
不变
<!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
<!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的构造函数
测试为了演示 这种双向关联的 两种导航都时可以的
测试代码 可以这么写
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]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
<!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:
所以查询语句这么写更好
...{
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
<!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>
<!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
<!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
//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
//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
//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;
}
}
//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
//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
//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
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);
相关推荐
hibernate3.2关联关系、事务等,自己总结,适合初学者和想要提高水平者。
Hibernate环境搭建 Hibernate主要接口 Hibernate主要映射 Hibernate的lazy、fetch、cascade等策略 Hibernate性能优化
hibernate3.2 hibernate3.2 hibernate3.2 hibernate3.2
这是一个struts 1.2 + spring 2.5 + hibernate 3.2框架demo, 运行环境为eclipse 3.2 + tomcat 5.5 + oracle 11g
Hibernate3.2官方中文参考手册.pdf+Hibernate.pdf(Hibernate的学习资料)
scr压缩包中含Hibernate3.2整套源码,对于Hibernate的学习者来说不可多得哦~
Hibernate实体关联关系映射--学习总结,让同仁们更好的学习Hiebernate
Hibernate高官谈Hibernate3.2新特性
hibernate3.2的chm格式api手册。
Hibernate3.2 数据持久层框架必不可少的jar包,直接放在lib目录里即可使用。
hibernate3.2 源码 hibernate 源码 hibernate3.2
hibernate 3.2 hibernate 3.2 hibernate 3.2 hibernate 3.2 hibernate 3.2
Hibernate 3.2 中文参考手册 博文链接:https://luxiangdong.iteye.com/blog/214583
hibernate3.2 需要的hibernate3.2以及所有文件,非常全面,该有的都有。
整合struts2.1和hibernate3.2的JAR包
hibernate 3.2用到的jar包
可持久化层hibernate3.2 帮助文档
Struts2+hibernate3.2+Spring2.0架构搭建的菜鸟实例,按照每一步搭建自己的软件架构
struts2+spring2.5+hibernate3.2整合完整项目,带数据库脚本 ,mysql,tomcat,myeclipse完整工程