这期内容当中小编将会给大家带来有关Hibernate中怎么实现多对一和一对多操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
创新互联主营商丘网站建设的网络公司,主营网站建设方案,成都app开发,商丘h5小程序设计搭建,商丘网站营销推广欢迎商丘等地区企业咨询
1、多对一和一对多概念
其实这个概念上来说很简单,比如一个客户可以有多个订单,多个订单属于同一个客户。就是最基本的一对多,和多对一。数据库使用中,感觉多对一和一对多算是比较常见的逻辑关系了。
我曾经做过一些数据库,比如某些政府部门的,其表单很设计的很简单粗糙,甚至连主键都没有,完全靠在事务层补全这些关系。其实通过Hibernate持久层来实现逻辑关系也是很不错的方法。下面的例子,就是数据库逻辑上基本没有定义,主要放在持久层里面。这个也主要是我对数据库操作属于半通水的原因。
2、数据库层
这里面有两个表单,一个CUSTOMER,客户表单,一个是ORDERS,订单表单。生成客户表单,这个是在SQLServer里面做的,其实其他都一样,因为逻辑关系在Hibernate上面,id是主键非空,其他可以为空:
CREATETABLE[dbo].[CUSTOMER]( [id][numeric](18,0)NOTNULL, [name][varchar](50)NULL, [age][int]NULL, CONSTRAINT[PK_CUSTOMER]PRIMARYKEY)
订单表单
id为主键非空,CUSTOMER_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 )
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
这个里面,其他都很简答了,其中
其中,set表示,对应集合;fetch和lazy主要是用来级联查询的,而cascade和inverse主要是用来级联插入和修改的,这几个主要包括对集合的控制。
ORDERS的hbm
表示CUSTOMER熟悉对应的类,和其作为key的列名,上面这些都可以在MyEclipse里面自动生成。另外注意的一点是,在生成的DAO里面,涉及表单操作的save()和delete()方法,必须要事件提交,数据库才有反映。可以就该Hibernate.xml,或者用下面这样代码来实现:
Sessionse=getSession(); Transactiontx=se.beginTransaction(); se.delete(persistentInstance); //se.save(instance); tx.commit();
4、验证效果
1、新增用户
如果新增一个用户,该用户里面包含有两个表单,那么,由于持久层已经实现了逻辑关系,只要用户类里面的set包含了表单,则表单可以自动增加。实现代码:
CustomerDAOcd=newCustomerDAO(); Customerxd=newCustomer("王小虎",20,null); Ordersord1=newOrders(); ord1.setCustomer(xd); ord1.setOrderNumber("王小虎的买单1"); Ordersord2=newOrders(); ord2.setCustomer(xd); ord2.setOrderNumber("王小虎的买单2"); Setrderses=newHashSet(); orderses.add(ord1); orderses.add(ord2); xd.setOrderses(orderses); cd.save(xd);
代码里面,加入一个王小虎用户。两个订单,通过setOrderses加入,只使用cd.save这一个对持久层操作。完成后查询:
王小虎 ================================= 王小虎的买单1 王小虎的买单2
显示,CUSTOMER里面加入了王小虎,ORDERS里面也加入他的订单。
2、删除操作
ListcsList=cd.findByProperty("name","王小虎"); for(Customercs:csList){ cd.delete(cs); }
上述就是小编为大家分享的Hibernate中怎么实现多对一和一对多操作了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。