首页 | 源码下载 | 网站模板 | 网页特效 | 广告代码 | 网页素材 | 字体下载 | 书库 | 站长工具
会员投稿 投稿指南 RSS订阅
当前位置:主页>网络编程>java教程>资讯:Hibernate的多对一和一对多操作实例

Hibernate的多对一和一对多操作实例

www.jz123.cn  2010-04-16   来源:   中国建站    责任编辑(袁袁)    我要投递新闻

 Hibernate的一对多和多对一操作真的很方便,如果系统采用Hibernate作为持久层,完全可以把对应的一对多和多对一逻辑关系放在Hibernate里面控制,减少数据库的负担,而且也更清晰。

  1、多对一和一对多概念

  其实这个概念上来说很简单,比如一个客户可以有多个订单,多个订单属于同一个客户。就是最基本的一对多,和多对一。数据库使用中,感觉多对一和一对多算是比较常见的逻辑关系了。

  我曾经做过一些数据库,比如某些政府部门的,其表单很设计的很简单粗糙,甚至连主键都没有,完全靠在事务层补全这些关系。其实通过Hibernate持久层来实现逻辑关系也是很不错的方法。下面的例子,就是数据库逻辑上基本没有定义,主要放在持久层里面。这个也主要是我对数据库操作属于半通水的原因。

  2、数据库层

  这里面有两个表单,一个CUSTOMER,客户表单,一个是ORDERS,订单表单。生成客户表单,这个是在SQLServer里面做的,其实其他都一样,因为逻辑关系在Hibernate上面,id是主键非空,其他可以为空:


CREATETABLE[dbo].[ORDERS](   
[id][numeric](18,0)NULLPRIMARYKEY,   
[CUSTOMER_id][numeric](18,0)NOTNULL,   
[ORDER_NUMBER][varchar](50)NULL,   
[PRICE][numeric](18,3)NULL   

  订单表单

  id为主键非空,CUSTOMER_id是对应客户主键,也非空,这里不做外键设置。


CREATETABLE[dbo].[CUSTOMER](   
[id][numeric](18,0)NOTNULL,   
[name][varchar](50)NULL,   
[age][int]NULL,   
CONSTRAINT[PK_CUSTOMER]PRIMARYKEY) 

  3、Hibernate设定

  HIbernate里面,一对多的对象体现,是客户有一个集合set,set里面放着对应订单,而多对一体现,是订单里面有一个CUSTOMER对象,表明该订单所属的客户。其中,CUSTOMER类为:


publicclassCustomerimplementsjava.io.Serializable{   
privateLongid;   
privateStringname;   
privateIntegerage;   
privateSetrderses=newHashSet();   
 
} 

  后面的getXXX和setXXX方法就省去了,同样订单类就是:


publicclassOrdersimplementsjava.io.Serializable{   
privateLongid;   
privateCustomercustomer;   
privateStringorderNumber;   
privateDoubleprice;   
 

  而对应hbm文档,就是map文档如下:


CUSTOMER.hbm.xml   
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"   
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<!--   
MappingfileautogeneratedbyMyEclipsePersistenceTools   
-->  
<hibernate-mapping>  
<classnameclassname="onetomany.Customer"table="CUSTOMER"schema="dbo"catalog="DBTEST">  
<idnameidname="id"type="java.lang.Long">  
<columnnamecolumnname="id"precision="18"scale="0"/>  
<generatorclassgeneratorclass="increment"/>  
</id>  
<propertynamepropertyname="name"type="java.lang.String">  
<columnnamecolumnname="name"length="50"/>  
</property>  
<propertynamepropertyname="age"type="java.lang.Integer">  
<columnnamecolumnname="age"/>  
</property>  
<setnamesetname="orderses"inverse="true"lazy="true"cascade="all">  
<key>  
<columnnamecolumnname="CUSTOMER_id"precision="18"scale="0"not-null="true"/>  
</key>  
<one-to-manyclassone-to-manyclass="onetomany.Orders"/>  
</set>  
</class>  
</hibernate-mapping> 

上一篇:Java Socket传输数据的文件系统介绍 下一篇:JAVA中用递归函数来删除子目录的方法

评论总数:0 [ 查看全部 ] 网友评论


关于我们隐私版权广告服务友情链接联系我们网站地图