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是对应客户主键,也非空,这里不做外键设置。
6. CREATETABLE[dbo].[ORDERS](
7. [id][numeric](18,0)NULLPRIMARYKEY,
8. [CUSTOMER_id][numeric](18,0)NOTNULL,
9. [ORDER_NUMBER][varchar](50)NULL,
10. [PRICE][numeric](18,3)NULL
11. )
3、Hibernate设定
HIbernate里面,一对多的对象体现,是客户有一个集合set,set里面放着对应订单,而多对一体现,是订单里面有一个CUSTOMER对象,表明该订单所属的客户。其中,CUSTOMER类为:
12. publicclassCustomerimplementsjava.io.Serializable{
13. privateLongid;
14. privateStringname;
15. privateIntegerage;
16. privateSetrderses=newHashSet();
17.
18. }
后面的getXXX和setXXX方法就省去了,同样订单类就是:
19. publicclassOrdersimplementsjava.io.Serializable{
20. privateLongid;
21. privateCustomercustomer;
22. privateStringorderNumber;
23. privateDoubleprice;
24.
25. }
而对应hbm文档,就是map文档如下:
26. CUSTOMER.hbm.xml
27. <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
28. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
29. <!--
30. MappingfileautogeneratedbyMyEclipsePersistenceTools
31. -->
32. <hibernate-mapping>
33. <classnameclassname="onetomany.Customer"table="CUSTOMER"schema="dbo"catalog="DBTEST">
34. <idnameidname="id"type="java.lang.Long">
35. <columnnamecolumnname="id"precision="18"scale="0"/>
36. <generatorclassgeneratorclass="increment"/>
37. </id>
38. <propertynamepropertyname="name"type="java.lang.String">
39. <columnnamecolumnname="name"length="50"/>
40. </property>
41. <propertynamepropertyname="age"type="java.lang.Integer">
42. <columnnamecolumnname="age"/>
43. </property>
44. <setnamesetname="orderses"inverse="true"lazy="true"cascade="all">
45. <key>
46. <columnnamecolumnname="CUSTOMER_id"precision="18"scale="0"not-null="true"/>
47. </key>
48. <one-to-manyclassone-to-manyclass="onetomany.Orders"/>
49. </set>
50. </class>
51. </hibernate-mapping>
这个里面,其他都很简答了,其中<generatorclass="increment"/>表示主键值自动增加,这个主要针对字符串对应的,主要体现多对以的是:
1. <setnamesetname="orderses"inverse="true"lazy="true"cascade="all">
2. <key>
3. <columnnamecolumnname="CUSTOMER_id"precision="18"scale="0"not-null="true"/>
4. </key>
5. <one-to-manyclassone-to-manyclass="onetomany.Orders"/>
6. </set>
其中,set表示,对应集合;fetch和lazy主要是用来级联查询的,而cascade和inverse主要是用来级联插入和修改的,这几个主要包括对集合的控制。<one-to-manyclass="onetomany.Orders"/>表示对应类,即set里面包含的类,而key主要是用于确定set里面对应表单列。
7. ORDERS的hbm
8. <?xmlversionxmlversion="1.0"encoding="utf-8"?>
9. <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
10. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
11. <!--
12. MappingfileautogeneratedbyMyEclipsePersistenceTools
13. -->
14. <hibernate-mapping>
15. <classcatalogclasscatalog="DBTEST"name="onetomany.Orders"schema="dbo"table="ORDERS">
16. <idnameidname="id"type="java.lang.Long">
17. <columnnamecolumnname="id"precision="18"scale="0"/>
18. <generatorclassgeneratorclass="increment"/>
19. </id>
20. <many-to-oneclassmany-to-oneclass="onetomany.Customer"fetch="select"name="customer">
21. <columnnamecolumnname="CUSTOMER_id"precision="18"scale="0"/>
22. </many-to-one>
23. <propertygeneratedpropertygenerated="never"lazy="false"name="orderNumber"type="java.lang.String">
24. <columnlengthcolumnlength="50"name="ORDER_NUMBER"/>;
分享到:
相关推荐
总之,理解并熟练掌握Hibernate的一对一、一对多和多对多关联关系,对于提升Java EE应用的开发效率和代码质量至关重要。通过实例化这些关系,开发者可以更好地管理和操作数据库中的复杂数据结构,从而实现更灵活和...
标题中的“hibernate一对多实例”指的是在Java编程中使用Hibernate框架处理数据库关系时的一对多关联映射。Hibernate是Java领域中的一个流行对象关系映射(ORM)框架,它允许开发者用面向对象的方式操作数据库,从而...
在Java的持久化框架Hibernate中,一对多关系是数据库中常见的关联类型,它表示一个...通过这两个实例,我们可以学习到如何配置、操作以及优化一对多关系,从而在实际开发中更有效地利用Hibernate进行数据持久化操作。
在这个“hibernate实例(一对多,多对一)”的主题中,我们将深入探讨两种重要的关联关系:一对一(One-to-One)和一对多(One-to-Many)。 **一对一关联(One-to-One)** 在一对一关联中,一个实体与另一个实体之间...
**标题:“Hibernate双向一对多经典实例”** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用面向对象的方式处理数据。本实例将聚焦于Hibernate中的一对多关系...
本教程将详细讲解如何在Hibernate中实现一对多的关系实例,涵盖一对多的插入和查询操作。 首先,我们要理解一对多关系的基本概念。在数据库设计中,一对多关系意味着一个实体可以与多个其他实体相关联。例如,一个...
本文将深入探讨Hibernate中的一对多、多对一、一对一以及多对多四种关系映射的配置实例,帮助开发者更好地理解和运用这些关系。 ### 一对多关系(One-to-Many) 在数据库设计中,一对多关系是最常见的一种关联,...
总之,Hibernate的一对一、一对多和多对多关系映射是Java开发中的重要概念,它们为对象模型提供了与数据库模型之间的桥梁。通过对这些关系的理解和实践,你可以更好地掌握Hibernate框架,从而在项目开发中发挥出更大...
标题"Hibernate多对多实例+数据库代码"揭示了我们将在讨论一个使用Hibernate框架实现的多对多关系映射的实际案例。在这个实例中,开发人员将两个或多个实体之间的复杂关联转化为简单易懂的数据库操作。描述中提到...
本实例将深入探讨如何使用Hibernate配置和处理一对多的关系。 首先,我们来理解一对多关系的基本概念。在数据库设计中,一对多关系表示一个表中的记录可以与另一个表中的多个记录相关联。在Hibernate中,这个关系...
在Java的持久化框架中,Hibernate是一个非常重要的...需要注意的是,处理一对多关系时要合理配置级联操作和缓存策略,以避免性能问题和数据一致性风险。此外,还要根据实际需求选择合适的关联方向和是否添加外键约束。
通过这种方式,我们就可以在Hibernate中设置一对多非主键关联,使得在操作部门和员工数据时,能够方便地维护它们之间的关系。这种方法允许我们在不违反数据库设计原则的情况下,灵活地处理实体之间的关联。同时,非...
本文将详细解析" Hibernate一对多关联实例 ",并涵盖关联的保存(save)、删除(delete)、查询(select)和更新(update)操作。 一、一对多关联概念 在数据库设计中,一对多关联表示一个表中的记录可以与另一个表中的多个...
1. **关联类型:** Hibernate支持四种基本的关联类型,包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。本主题将主要聚焦在一对一和一对多关联。 2. **关联的方向性:**...
总的来说,这个“hibernate 多对多 映射实例,学生 选课”项目涵盖了Hibernate的多对多关系映射、数据库设计、对象模型构建、事务管理等多个方面,是一个很好的学习和实践Hibernate的实战案例。通过深入理解和实践这...
10. **关联映射**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)关系的映射。 **文件名解析** 文件名称“hibernate-release-4.0.0.CR3”看起来是Hibernate的一个特定...
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...