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

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

专注于为中小企业提供成都网站设计、网站建设、外贸网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业南城免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

1、多对一和一对多概念

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

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

2、数据库层

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

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

订单表单

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

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

3、Hibernate设定

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

 
 
 
  1. publicclassCustomerimplementsjava.io.Serializable{
  2. privateLongid;
  3. privateStringname;
  4. privateIntegerage;
  5. privateSetrderses=newHashSet();

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

 
 
 
  1. publicclassOrdersimplementsjava.io.Serializable{
  2. privateLongid;
  3. privateCustomercustomer;
  4. privateStringorderNumber;
  5. privateDoubleprice;

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

 
 
 
  1. CUSTOMER.hbm.xml
  2. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

#p#
这个里面,其他都很简答了,其中表示主键值自动增加,这个主要针对字符串对应的,主要体现多对以的是:

 
 
 

其中,set表示,对应集合;fetch和lazy主要是用来级联查询的,而cascade和inverse主要是用来级联插入和修改的,这几个主要包括对集合的控制。表示对应类,即set里面包含的类,而key主要是用于确定set里面对应表单列。

 
 
 
  1. ORDERS的hbm
  2. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

表示CUSTOMER熟悉对应的类,和其作为key的列名,上面这些都可以在MyEclipse里面自动生成。另外注意的一点是,在生成的DAO里面,涉及表单操作的save()和delete()方法,必须要事件提交,数据库才有反映。可以就该Hibernate.xml,或者用下面这样代码来实现:

 
 
 
  1. Sessionse=getSession();
  2. Transactiontx=se.beginTransaction();
  3. se.delete(persistentInstance);
  4. //se.save(instance);
  5. tx.commit();

4、验证效果

1、新增用户

如果新增一个用户,该用户里面包含有两个表单,那么,由于持久层已经实现了逻辑关系,只要用户类里面的set包含了表单,则表单可以自动增加。实现代码:

 
 
 
  1. CustomerDAOcd=newCustomerDAO();
  2. Customerxd=newCustomer("王小虎",20,null);
  3. Ordersord1=newOrders();
  4. ord1.setCustomer(xd);
  5. ord1.setOrderNumber("王小虎的买单1");
  6. Ordersord2=newOrders();
  7. ord2.setCustomer(xd);
  8. ord2.setOrderNumber("王小虎的买单2");
  9. Setrderses=newHashSet();
  10. orderses.add(ord1);
  11. orderses.add(ord2);
  12. xd.setOrderses(orderses);
  13. cd.save(xd);

代码里面,加入一个王小虎用户。两个订单,通过setOrderses加入,只使用cd.save这一个对持久层操作。完成后查询:

 
 
 
  1. 王小虎
  2. =================================
  3. 王小虎的买单1
  4. 王小虎的买单2

显示,CUSTOMER里面加入了王小虎,ORDERS里面也加入他的订单。

2、删除操作

 
 
 
  1. ListcsList=cd.findByProperty("name","王小虎");
  2. for(Customercs:csList){
  3. cd.delete(cs);
  4. }

这个很简单了,通过其中findByProperty("name","王小虎");对应SQL为deletefromtableCUSTOMERwherename=''王小虎';删除了王小虎,而ORDERS里面,王小虎对应的表单也同时被删除。

5、小小总结

Hibernate的多对一和一对多处理,还是挺方便的,如果在减少数据库复杂度的原则来说,把一些逻辑处理放在持久层是一个常见的方法。

标题名称:Hibernate的多对一和一对多操作实例
本文URL:http://www.shufengxianlan.com/qtweb/news30/409980.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联