栏目导航
热点推荐
- 三十条有用的 Java 编程规则
- Java制作水印图片源码
- Java常见异常及可能的导致原因
- Java中的修饰词使用方法总结
- J2EE系统异常的处理准则
- Java中的异常、断言、日志解析(
- Java面试技巧:Java面试题集锦(
- 面向Java开发人员的Scala指南:
- Java程序员:一刻钟精通正则表达
- 网友经验分享:学好java开发的关
- 专家解答:创建表格与数据库进行
- Java远程访问Domino数据库
阅览排行
Hibernate的多对一和一对多操作实例
www.jz123.cn 2010-04-16 来源: 中国建站 责任编辑(袁袁) 我要投递新闻
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中用递归函数来删除子目录的方法