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: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里单向和多向关系有什么区别 - ?
并放阿拉: 一对一:比如说:一个人会有一个基本信息 多对一和一对多,一个意思:就是说:一个人有多个地址,多对多:多个地址对一个人,一个地址也有多个人 可以理解成;多对一,一对多