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

作者&投稿:卢兴 (若有异议请与网页底部的电邮联系)
~

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

   多对一和一对多概念

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

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

   数据库层

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

   CREATETABLE[dbo] [CUSTOMER](

   [id][numeric]( )NOTNULL

   [name][varchar]( )NULL

   [age][int]NULL

   CONSTRAINT[PK_CUSTOMER]PRIMARYKEY)

  订单表单

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

   CREATETABLE[dbo] [ORDERS](

   [id][numeric]( )NULLPRIMARYKEY

   [CUSTOMER_id][numeric]( )NOTNULL

   [ORDER_NUMBER][varchar]( )NULL

   [PRICE][numeric]( )NULL

   )

   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/HibernateMappingDTD //EN

   mapping dtd >

   <!

   MappingfileautogeneratedbyMyEclipsePersistenceTools

   >

   <hibernate mapping>

   <classnameclassname= onetomany Customer table= CUSTOMER schema= dbo catalog= DBTEST >

   <idnameidname= id type= java lang Long >

   <columnnamecolumnname= id precision= scale= />

   <generatorclassgeneratorclass= increment />

   </id>

   <propertynamepropertyname= name type= java lang String >

   <columnnamecolumnname= name length= />

   </property>

   <propertynamepropertyname= age type= java lang Integer >

   <columnnamecolumnname= age />

   </property>

   <setnamesetname= orderses inverse= true lazy= true cascade= all >

   <key>

   <columnnamecolumnname= CUSTOMER_id precision= scale= not null= true />

   </key>

   <one to manyclassone to manyclass= onetomany Orders />

   </set>

   </class>

   </hibernate mapping>

  这个里面 其他都很简答了 其中<generatorclass= increment />表示主键值自动增加 这个主要针对字符串对应的 主要体现多对以的是

   <setnamesetname= orderses inverse= true lazy= true cascade= all >

   <key>

   <columnnamecolumnname= CUSTOMER_id precision= scale= not null= true />

   </key>

   <one to manyclassone to manyclass= onetomany Orders />

   </set>

  其中 set表示 对应集合 fetch和lazy主要是用来级联查询的 而cascade和inverse主要是用来级联插入和修改的 这几个主要包括对集合的控制 <one to manyclass= onetomany Orders />表示对应类 即set里面包含的类 而key主要是用于确定set里面对应表单列

   ORDERS的hbm

   <?xmlversionxmlversion= encoding= utf ?>

   <!DOCTYPEhibernate mappingPUBLIC //Hibernate/HibernateMappingDTD //EN

   mapping dtd >

   <!

   MappingfileautogeneratedbyMyEclipsePersistenceTools

   >

   <hibernate mapping>

   <classcatalogclasscatalog= DBTEST name= onetomany Orders schema= dbo table= ORDERS >

   <idnameidname= id type= java lang Long >

   <columnnamecolumnname= id precision= scale= />

   <generatorclassgeneratorclass= increment />

   </id>

   <many to oneclas *** any to oneclass= onetomany Customer fetch= select name= customer >

   <columnnamecolumnname= CUSTOMER_id precision= scale= />

   </many to one>

   <propertygeneratedpropertygenerated= never lazy= false name= orderNumber type= java lang String >

   <columnlengthcolumnlength= name= ORDER_NUMBER />

   </property>

   <propertygeneratedpropertygenerated= never lazy= false name= price type= java lang Double >

   <columnnamecolumnname= PRICE precision= scale= />

   </property>

   </class>

   </hibernate mapping>

   <many to oneclas *** any to oneclass= onetomany Customer fetch= select name= customer >

   <columnnamecolumnname= CUSTOMER_id precision= scale= />

   </many to one>

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

   Sessionse=getSession();

   Transactiontx=se beginTransaction();

   se delete(persistentInstance);

   //se save(instance);

  mit();

   验证效果

   新增用户

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

   CustomerDAOcd=newCustomerDAO();

   Customerxd=newCustomer( 王小虎 null);

   Ordersord =newOrders();

   ord setCustomer(xd);

   ord setOrderNumber( 王小虎的买单 );

   Ordersord =newOrders();

   ord setCustomer(xd);

   ord setOrderNumber( 王小虎的买单 );

   Setrderses=newHashSet();

   orderses add(ord );

   orderses add(ord );

   xd setOrderses(orderses);

   cd save(xd);

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

   王小虎

   =================================

   王小虎的买单

   王小虎的买单

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

   删除操作

   List<Customer>csList=cd findByProperty( name 王小虎 );

   for(Customercs:csList){

   cd delete(cs);

   }

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

   小小总结

lishixinzhi/Article/program/Java/ky/201311/28543




Hibernate3 使用原生sql 返回集能用hbm.xml配置文件映射到类里吗?_百...
三,heibernate的主键映射方式:在<id ...>节点下用<generator class="映射方式"\/>节点指定Hibernate向数据库插入数据时主键的生成方式 l assigned:应用程序自身对id赋值。当设置<generator class="assigned"\/>时,应用程序自身需要负责主键id的赋值,由外部程序负责生成(在session.save()之前为对象的...

hibernate二级缓存什么时候用
Hibernate缓存分为二级,第一级存放于session中称为一级缓存,默认带有且不能卸载。第二级是由sessionFactory控制的进程级缓存。是全局共享的缓存,凡是会调用...ibernate提供了二级缓存的接口: net.sf.hibernate.cache.Provider, 同时提供了一个默认的 实现net.sf.hibernate.cache.HashtableCacheProvider, 也可以配置 ...

Java的运行平台是什么?
Java框架:Sturts(Sturts1.x、Struts2.x)、Heibernate、Spring2.5、EJB3.0,以及数据库方面:MySql、SQL Server、Oracle、DB2,以及:XML(DTD,Schema,XSL,Dom)、HTML、CSS、JavaScript(特别是AJax技术!!!Javascript是基础),还要会部署常用的服务器:TomCat、Jboss等 Java ME,微型移动设备程序...

高分java连接SQL server 2000 详细步骤
<ibernate-configuration><ession-factory name="java:\/hibernate\/HibernateFactory"><roperty name="show_sql">rue<property><roperty name="connection.driver_class">oracle.jdbc.driver.OracleDriver <-- 这里是Oracle 9i的JDBC driver class名 --><property><roperty name="connection.url">jdbc:oracle:oci8:@...

ssh框架与ssm选哪个好
总结:SSM和SSH不同主要在MVC实现方式,以及ORM持久化方面不同(Hiibernate与Mybatis)。SSM越来越轻量级配置,将注解开发发挥到极致,且ORM实现更加灵活,SQL优化更简便;而SSH较注重配置开发,其中的Hiibernate对JDBC的完整封装更面向对象,对增删改查的数据维护更自动化,但SQL优化方面较弱,且入门门槛...

合阳县15766124340: hibernate的一对多和多对一 -
并放阿拉: 一对多和多对一只是针对不同的参照物说的,其实两者本质是相同的,都是描述两个实体对象的关联关系.一对多时,在一的一端持有多的引用,当获得一对象的同时,就可以查出与其关联的多端的所有对象.多对一多关系同理.

合阳县15766124340: hibernate:hibernate总提到的一对一和多对一是什么意思呢?
并放阿拉: 数据库中,多表关联的几种映射关系,一对一,多对一,一对多,多对多等等!!

合阳县15766124340: Hibernate对象关系是一对多好还是多对一好??为什么?? -
并放阿拉: 一对多 和多对一 一般是看需求来确定的,很多时候都是设置成双向的 举个最最普通的离子 :一个班级里面有多个学生 多个学生属于一个班级 从学生表来看 就是多对一的关系 从班级表来看就是一对多的关系 需求上如果说是从学生表想看到班级...

合阳县15766124340: 请给我讲讲在hibernate中,什么时候用“一对多”、“多对一”、“一对一”、“多对多”? -
并放阿拉: 1.什么时候用? 这个取决于需求,比如,你的师生管理项目中,客户已经明确规定,在这个项目中,老师可以教多个学生,学生也可以有多个老师,这很明显是m:n就是多对多的关系.如果说做部门与员工这样的表,那么一个部门可以有多个员工,但是,每个员工只能在一个部门工作,这就是一个1:M一对多的关系.到底要用哪种关系,取决于你对客户需求的理解 2.怎么用? 楼主已经表明不要用拷贝,所以推荐楼主去www.hibernate.org看看文档,其中有关系映射这部分,包括了,很多方面的关联,单、双向关联、带第三张表的单双向关联,不再赘述.

合阳县15766124340: hibernate中对象的几种关系能够讲解下吗?
并放阿拉: 1.一对多:就是一的一方知道多的一方,而多的一方不知道一的一方 2.多对一:同上相反 3.一对一:大家都知道大家 4.多对多:建议分成3个表.实现两个多对一. 建议:在数据库里多的一方会存储着一的一方的一个外键,在类里就该把它换成一的一方的一个对象了... 不太会说...不明白就去查下吧....

合阳县15766124340: hibernate 单向一对多问题 -
并放阿拉: 单向一对多只需要在多的一方增加一个一的一方的属性就ok了,这样在数据库表中多的一方的表中会有一个外键.而看你说的学生实体里有个班级实体的属性,班级实体里有个学生集合属性,这样就成双向的了

合阳县15766124340: Hibernate 一对多, 多对一的理解.
并放阿拉: 一个用户可以只能对应一个组织,但是一个组织有多个用户,这就代表了是一对多或者是多对一的关系(其实都是一个东西,分别从哪头看) 一对一的关系是一个只能对应一个. 举个例子:一台车,只能有一个车牌,而这个车牌也只能属于这一台车. many-to-one 是指当前的类中 那个“一”的属性, 例如你举得例子: 在用户表中就应该有个 many-to-one 对应组织表中的 用户set; 意思就是,在“一”的那端要有many-to-one 在多的那端 要有一个set 明白了么?

合阳县15766124340: hibernate中一对多和多对多映射是怎么回事? -
并放阿拉: 至于一对多和多对多指的就是现实生活中的物,例如:寝室对学生(一对多),老师与学生(多对多),现在用hibernate只是想把这个一对多和多对多描述出来,主要起到中间的作用,它会自动与数据库模型对应,给我们提供了方便,说白了就是,我们可以像操作对象一样操作数据库.明白了么

合阳县15766124340: 在Hibernate中,1对多和多对1有什么区别吗? -
并放阿拉: 一个老爸可以有多个孩子,一个孩子只有一个老爸. 老爸想“他们 都是我的孩子!” —— 一对多 孩子们想“他 是我们的老爸!” —— 多对一 ~.~|| 再-婚的不考虑......

合阳县15766124340: hibernate里单向和多向关系有什么区别 -
并放阿拉: 一对一:比如说:一个人会有一个基本信息 多对一和一对多,一个意思:就是说:一个人有多个地址,多对多:多个地址对一个人,一个地址也有多个人 可以理解成;多对一,一对多

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网