- 浏览: 517232 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (278)
- java (41)
- 设计模式 (4)
- sql (10)
- webservice (2)
- spring (9)
- struts (6)
- struts2 (32)
- hibernate (27)
- Struts_hibernate_Spring整合 (4)
- Velocity (1)
- Servlet (9)
- JSP (6)
- javascript (19)
- jquery (10)
- ajax (4)
- html、xml (3)
- JDBC (2)
- JDK (6)
- mysql (2)
- oracle (11)
- SqlServer (1)
- DB2 (4)
- tool (7)
- linux (5)
- UML (1)
- eclipse (8)
- 执行文件 (1)
- 应用服务器 (4)
- 代码重构 (1)
- 日本語 (19)
- 交规 (1)
- office (9)
- firefox (1)
- net (1)
- 测试 (1)
- temp (6)
- 对日外包 (1)
- windows (1)
- 版本控制 (1)
- android (2)
- 项目管理 (1)
最新评论
转:http://www.iteye.com/topic/766211
public class Customer { private int id; private String name; private Set orders = new HashSet(); }
即Customer类具有一个set集合属性orders,其中Order类定义如下:
public class Order { private int id; private String orderName; }
数据库中表的结构:
t_customer: 两个字段: id
name
t_order: 三个字段: id
orderName
customerid
Customer类的映射文件:Customer.hbm.xml
<hibernate-mapping> <class name="test.Customer" table="t_customer" lazy="false"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="orders" cascade="save-update" lazy="false"> <key column="customerid"/> <one-to-many class="test.Order"/> </set> </class> </hibernate-mapping>
执行如下代码:
Set orders = new HashSet(); Order o1 = new Order(); o1.setOrderName("o1"); Order o2 = new Order(); o2.setOrderName("o2"); orders.add(o1); orders.add(o2); Customer c = new Customer(); c.setName("aaa"); c.setOrders(orders); session.save(c);
此时Hibernate发出的sql语句如下:
Hibernate: insert into t_customer (name) values (?) Hibernate: insert into t_order (orderName) values (?) Hibernate: insert into t_order (orderName) values (?) Hibernate: update t_order set customerid=? where id=? Hibernate: update t_order set customerid=? where id=?
查看数据库:
t_customer : t_order:
id | name id | orderName | customerid
1 aaa 1 o1 1
2 o2 1
分析:保存Customer对象时,首先发出insert into t_customer (name) values
(?)语句将c同步到数据库,由于在<set>映射中设置cascade="save-update",所以会级联保存orders集合中的
Order类型的o1,o2对象。
现在set映射中设置
inverse="true"
,再次执行上述代码,查看sql语句:
Hibernate: insert into t_customer (name) values (?) Hibernate: insert into t_order (orderName) values (?) Hibernate: insert into t_order (orderName) values (?)
相比上一次执行,少了两条update语句,查看数据库:
t_customer : t_order:
id | name id | orderName | customerid
1 aaa 1 o1 NULL
2 o2 NULL
发现t_order表中customerid的值为NULL,这是由于设置了inverse="true",它意味着
Customer不再作为主控方,而将关联关系的维护工作交给关联对象Orders来完成。在保存Customer
时,Customer不在关心Orders的customerid属性,必须由Order自己去维护,即设置
order.setCustomer(customer);
可以修改Order类代码:
public class Order { private int id; private String orderName; private Customer customer; }
映射文件Order.hbm.xml:
<hibernate-mapping> <class name="test.Order" table="t_order"> <id name="id"> <generator class="native"/> </id> <property name="orderName"/> <many-to-one name="customer" column="customerid"/> </class> </hibernate-mapping>
此时数据库中表的结构不会变化。
再次执行上述代码,发出如下sql语句:
Hibernate: insert into t_customer (name) values (?) Hibernate: insert into t_order (orderName, customerid) values (?, ?) Hibernate: insert into t_order (orderName, customerid) values (?, ?)
发现在保存Order对象时为customerid字段赋值,因为Order对象中拥有Customer属性,对应customerid字段,查看数据库表:
t_customer : t_order:
id | name id | orderName | customerid
1 aaa 1 o1 NULL
2 o2 NULL
发现customerid的值仍为NULL,因为在上述代码中并未设置Order对象的Customer属性值,由于设置了
inverse="true",所以Order对象需要维护关联关系,所以必须进行设置,即order.setCustomer(customer);
修改上述测试代码为:
••• Customer c = new Customer(); Set orders = new HashSet(); Order o1 = new Order(); o1.setOrderName("o1"); o1.setCustomer(c); Order o2 = new Order(); o2.setOrderName("o2"); o2.setCustomer(c); orders.add(o1); orders.add(o2); c.setName("aaa"); c.setOrders(orders); session.save(c);
Hibernate: insert into t_customer (name) values (?) Hibernate: insert into t_order (orderName, customerid) values (?, ?) Hibernate: insert into t_order (orderName, customerid) values (?, ?)
t_customer : t_order:
id | name id | orderName | customerid
1 aaa 1 o1 1
2 o2 1
发现已经设置了customerid的值。
在一对多关联中,在多的一方设置inverse="true",有助于性能的改善。通过上述分析可以发现少了update语句。
发表评论
文章已被作者锁定,不允许评论。
-
Hibernate 配置 说明
2011-11-29 09:05 1478Hibernate配置说明 <?xm ... -
hibernate 相关问题 (一)
2011-04-06 13:50 1462一、Hibernate缓存深入详解 看附件 ... -
hibernate 3.0 中 批量更新,批量删除
2010-09-09 12:51 979hibernate 2.1没有对批量更新和批量删除提供很好的支 ... -
hibernate one-to-one
2010-09-07 15:56 1422一。 1. 完全的一对一关系,即A与B两种实体,分两个表格, ... -
hibernate many-to-many
2010-09-07 15:26 878Inverse是hibernate双向关系 ... -
hibernate 集合排序 二 (数据库排序)
2010-09-03 11:03 1140<set><idbag>< ... -
hibernate 集合排序 一 (内存排序)
2010-09-03 10:52 1082内存中排序 <set><map ... -
hibernate map映射
2010-09-03 10:46 1018Person.java package com.aa ... -
hibernate list映射
2010-09-03 10:41 1115Answer类为Question类一对多关联关系,即一个问题对 ... -
hibernate idbag映射
2010-09-03 10:35 1046假设Team和Student是1对多的关系,而studen ... -
hibernate set映射
2010-09-03 10:27 1792Hibernate之容器映射 Set映射 两张表对应一个 ... -
hibernate 二级缓存(三)
2010-08-31 11:00 1364过这篇文章纪录hibernate二级缓存的一些使用经历,利用几 ... -
hibernate 二级缓存(二)
2010-08-31 10:48 11381 启用 Hibernate 二级缓存 Hibe ... -
hibernate 二级缓存(一)
2010-08-31 10:29 1835一。 1 . Hibernate ... -
hibernate 事务 并发
2010-08-27 10:17 1384数据库事务与并发 ... -
hibernate 执行 本地 sql
2010-08-25 10:47 17431.为了把sql查询返回的关系数据映射为对象,需 ... -
Hibernate3的配置参数汇总
2010-08-25 10:22 7531、Hibernate JDBC属性 属 ... -
正确理解 hibernate 的 inverse many-to-many
2010-08-25 10:18 815Inverse是hibernate双向关系 ... -
Hql 语法
2010-08-19 14:40 915HQL是完全面向对象的查询语言,因此可以支持继承和多态等特征。 ... -
hibernate检索策略(类级别检索,关联基本检索,延迟加载...)(二)
2010-08-16 22:36 1399转:http://blog.csdn.net/qking934 ...
相关推荐
在Java的持久化框架Hibernate中,多对多关联(Many-to-Many)是一种常见的数据库关系类型,用于表示两个实体之间存在多个对应关系。这种关联在实际应用中非常常见,例如学生与课程之间的关联,用户与角色之间的关联...
hibenrate的代码本人的培训的代码,老师讲解的很好。是一个学习hibenrate的好的工具
在实际开发中,我们经常需要更新数据库中的某些字段,而不是所有字段。那么,如何使用 Hibernate 实现更新某些字段呢? 首先,我们需要了解 Hibernate 的 update 方法。在 Hibernate 中, update 方法可以更新整个...
数据库和配置MySQL 飞路(用于数据迁移) GradleTomcat吉特Google Book API 后端技术JavaSpring MVC,Spring AOP,Spring Security Hibernate ORM,Hibernate Validator,Hibenrate Search(Lucene) 翻新,JSON ...
在IT行业中,构建企业级应用是一项复杂而重要的任务。Hibernate、Struts2和Spring是Java领域内非常流行的开源框架,它们分别在持久层、表现层和应用层提供了强大的支持。这三个框架的集成使用,可以构建出高效、稳定...
在这个系统中,用户可以通过输入公交线路号或者站点名称,获取到相应的公交信息,以便规划出行路线。 在技术实现上,Java作为后端开发的主要语言,以其强大的类库支持和跨平台特性,为系统的稳定运行提供了保障。...
hibernahibernate学习资料te学习资料hibernate学习资料v