两个持久化类。Customer 和 OrderForm

Customer 类。

package com.zcd.hibernate.manyToOne;

public class Customer
{
private Integer id;
private String name; public Customer()
{
} public Customer(String name)
{
this.name = name;
} public Customer(Integer id, String name)
{
this.id = id;
this.name = name;
}  //这里省略掉getter 和 setter 方法 }

OrderForm 类

package com.zcd.hibernate.manyToOne;

public class OrderForm
{
private Integer id;
private String name;
private Customer customer; public OrderForm()
{
} public OrderForm(String name, Customer customer)
{
this.name = name;
this.customer = customer;
} public OrderForm(Integer id, String name, Customer customer)
{
this.id = id;
this.name = name;
this.customer = customer;
} //这里省略掉getter 和 setter 方法 }

Customer 和 OrderForm 类的DAO 方法就是没有特别之处,这里也省略的。

//=======================分割线==========================================

下面是测试类调用Service 层。

Service 层的业务方法

public void save(Customer customer, OrderForm orderForm)
{
/*
* OrderForm 为多端, Customer 为一端
* 这里先保存一端,再保存多端。
*/ customerDao.save(customer);
orderFormDao.save(orderForm);
}

观察现象:这是基于以上 先保存一端,再保存多端的 Service 层的方法的。

//这个方法执行后有两条INSERT语句,能正常保存。
@Test
public void testInsert()
{
Customer customer = new Customer(1, "顾客"); OrderForm orderForm = new OrderForm(1, "订单1", customer); testService.save(customer, orderForm);
}
//但是有一个地方需要注意,如果不做任何改变,继续执行这个方法一次,这里虽然还是指定新建的Customer 对象的id 为1,
//OrderForm 对象的id 也为1,但是由于是新建的对象,所以在数据库里的他们的id 并不是1,都会在原来的表的基础上加1。比如这里他们的id 都为2,
//那么此时orderform 表中的 id 为 2 的这条数据的外键列的是指向customer 表中的 id 为1 的数据还是 id 为2 的那条数据呢?实际上结果如下图。
//此时orderform 表中的id为2的数据的外键列指向的是customer表中的id为2的那条数据。个人认为是因为,在第二次保存的 orderForm 对象中的属性就是
//第二次保存的customer对象,而那个对象的保存在数据表中的id 为2,所以外键列的值也为2.

------------------------------------------------------------------------------------------------------------------------

如果在新建的对象中没有指定id,代码如下

@Test
public void testInsert()
{
Customer customer = new Customer("顾客3");//没有指定id OrderForm orderForm = new OrderForm("订单3", customer);//没有指定id testService.save(customer, orderForm);
}

此时正常保存,需要注意的是,此时也只想数据库发送了两条INSERT 语句(因为这是先保存一端,再保存多端的决定的。),现在看一下,修改Service层,先保存多端,在保存一端.

public void save(Customer customer, OrderForm orderForm)
{
/*
* OrderForm 为多端, Customer 为一端
* 这里先保存多端,再保存一端。
*/ orderFormDao.save(orderForm);
customerDao.save(customer);
}

此时正常保存,但是向数据库发送了两条INSERT 语句和一条UPDATE语句,说明先保存多端再保存一端的时候性能下降了。

================================2017-09-24更============================

为什么先保存多端在保存一端的时候性能会下降呢?

应该是这两个类的关联关系是由多端维护的(也就是在多端的表中有一个外键列保存了一端的ID,因为这样才能把两者关联起来。)

如果我们先保存多端,此时它关联的一端的那条记录还没保存,所以一端的那条记录的ID还没有确定。此时多端的表中的那条记录的外键列还是空的。所以得等到一端保存后再对多端进行更新。

Hibernate多对一关联关系的更多相关文章

  1. 关于Hibernate多对多关联关系的更新问题。

    一个账套类Reckoning和账套项目类 AccountItem.这两个类是双向多对多关联关系. Reckoning.hbm.xml文件的配置如下 <set name="account ...

  2. Hibernate多对多关联关系

    今天遇到一个问题:有一个的类Reckoning,一个类AccountItem.这两个类之间的关系时多对多的关联关系. 一开始是由AccountItem来维护关联关系的,也就是Reckoning.hbm ...

  3. Hibernate(6)—— 一对多 和 多对多关联关系映射(xml和注解)总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XM ...

  4. Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

    One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotati ...

  5. 【SSH三大框架】Hibernate基础第六篇:多对一关联关系的映射、分析及加入、查询

    这里举样例用的是:部门与员工的关系. 一个部门能够相应多个员工,这就是非常明显的多对一关联关系. 我们须要建立两个实体类:员工(Employee).部门(Department) 员工类:Employe ...

  6. Hibernate-ORM:12.Hibernate中的多对多关联关系

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客将讲述Hibernate中的多对多关联关系的操作,准备的篇幅较少,望海涵 一,讲述多对多 多对多的关联 ...

  7. (转)Hibernate框架基础——多对多关联关系映射

    http://blog.csdn.net/yerenyuan_pku/article/details/52756536 多对多关联关系映射 多对多的实体关系模型也是很常见的,比如学生和课程的关系.一个 ...

  8. Hibernate双向一对多、双向多对多关联关系中的映射文件怎么写

    这里以一对多关联关系为例.以Country类为一端,Competition类为多端. 一个国家可以有多个赛事,但是一个赛事只能属于一个国家. Country类 public class Country ...

  9. hibernate多对一双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

随机推荐

  1. SVN命令行怎么用?--转百度知道

    http://zhidao.baidu.com/link?url=uPWXURahp5KzdXbgrGTb9-r-abGaNC-J7dkhFkMhf062OJ1jeCM5wpBCgDR7bDg8uFr ...

  2. XAMl使用其他命名空间中的类型及加载和编译

    以前我们讲过XAMl命名空间.为了使便宜钱知道XAMl文档中元素对应的.NET类型,需要知道XAMl明档中指定特定的两个命名空间.XAML是一种实例化.NET对象的通用方法 ,除了可以实例化一些标准的 ...

  3. 微信小程序开发框架整理

    目前除了原生的微信小程序开发外,各大厂商陆续造了自己的开发框架,现整理如下: WePY 腾讯官方开源的小程序组件化开发框架,目前有15K+Star ,一直在更新着,社区活跃,掉坑能快速的找到方法爬出来 ...

  4. SSM面试

    Spring两大核心:IOC AOP DI AOP:所谓面向切面变成,是一种通过预编译和运行期动态化代理的方式实现了再不修改源代码的情况下给程序动态添加功能的技术. Mybatis(半自动化实现obj ...

  5. HDU 1561 The more, The Better 经典树形DP

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  6. 三 Buffer

    使用Buffer一般遵循以下四个步骤 写入数据到Buffer 调用flip() 从Buffer中读取数据 调用clear()或者compact()方法 当向buffer写入数据时,buffer会记录下 ...

  7. 洛谷P3960 列队(动态开节点线段树)

    题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...

  8. font-size 基准

    浏览器的缺省字体为16px: 你可以先将基准字体大小设置为10px; body  { font-size: 62.5%; } 然后统一使用 em作为单位 div { font-size: 2.4em; ...

  9. Spark企业级应用开发和调优

    1.Spark企业级应用开发和调优 Spark项目编程优化历程记录,主要介绍了Spark企业级别的开发过程中面临的问题和调优方法.包含合理分配分片,避免计算中间结果(大数据量)的collect,合理使 ...

  10. ArcGIS for JavaScript 关于路径开发的一些记录(三)

    最近被一个bug困扰了两天~ 我新发布了一个NAserver(路径分析服务),但是放在之前的代码里面发现不能生成路径.经过我的调试发现并没有代码并没有报错,并且能够返回所生成路径的Graphic la ...