Hibernate的多对一和一对多操作实例
创始人
2024-06-28 04:20:45
0次

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();  
  6.  
  7. } 

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

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

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

  1. CUSTOMER.hbm.xml  
  2. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  

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

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  

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

  1. ORDERS的hbm  
  2.  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  

表示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的多对一和一对多处理,还是挺方便的,如果在减少数据库复杂度的原则来说,把一些逻辑处理放在持久层是一个常见的方法。

【编辑推荐】

  1. Hibernate批量更新与删除实例浅析
  2. 简述Hibernate Synchronizer学习笔记
  3. Hibernate column属性简介
  4. 概括Hibernate查询语言
  5. Hibernate cartridge学习总结

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...