070827 hibernate关联、联级操作、对象生命周期、检索策略

本文主要是介绍070827 hibernate关联、联级操作、对象生命周期、检索策略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在mysql里建立2个表
CREATE TABLE `customers` (
  `id` int(11) NOT NULL auto_increment,
  `name` char(20) character set latin1 default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `orders` (
  `id` int(11) NOT NULL auto_increment,
  `customer_id` int(50) NOT NULL default '0',
  `order_number` int(50) default NULL,
  PRIMARY KEY  (`id`),
  KEY `fk_customer_id` (`customer_id`),
  CONSTRAINT `fk_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后自动生成持久化类,在customers.hbm.xml一方设置与orders的外键customer_id的一对多关联,其中联级操作为save-update,inverse="true"为表示hibernate不由customers对象的状态变化来更新数据库,仅按照Orders对象状态变化来更新数据库。由此来优化hibernate的性能。
 <set name="orderses" inverse="true" cascade="save-update">
            <key>
                <column name="customer_id" unique="true" />
            </key>
            <one-to-many class="com.yourcompany.model.Orders" />
        </set>

在orders.hbm.xml设置多对一关联,其中业务逻辑决定了order是由customer来下决定的,所以必须not-null="true" ,联级操作根据实际情况而定,本例子的逻辑关系里面,应该不需要在many-to-one一方设置save-update联级操作,因为增加orders并不需要增加customer。在目前的情况里如果设置了save-update,增加orders记录的时候hibernate就会把原来已存在的customers记录设置为null。这是不对的。
        <many-to-one name="customers" class="com.yourcompany.model.Customers" fetch="select" >
            <column name="customer_id" not-null="true" unique="true" />
        </many-to-one>

在AddCustomerAction里保存一个customers,之后可以看到当保存一个customers的同时,orders也同时保存了该customers的id。
  String strname = addCustomerForm.getString("name");
  Customers customers = new  Customers();
  customers.setName(strname);
  Orders orders=new Orders();
  orders.setCustomers(customers);
  customers.getOrderses().add(orders);
  customersDAO.save(customers);

其中
  orders.setCustomers(customers);
  customers.getOrderses().add(orders);
在建立两个对象的双向关联时,应该同时修改关联两端的对象的相应属性,这样可提高业务逻辑的独立性。
比如:解除双向关联时:
  customers.getOrderses().remove(orders);
  orders.setCustomers(null);

在AddOrdersAction里,由表单传入customers的ID值和新增加的order_number值。ordersDAO.attachDirty(orders);为Myeclipse里生成的DAO,其调用的是HibernateTemplate的getHibernateTemplate().saveOrUpdate(instance);方法。
  Integer strcustomers= Integer.valueOf(addOrdersForm.getString("customers"));
  Integer strorder_number= Integer.valueOf(addOrdersForm.getString("order_number"));
  Orders orders = new  Orders(); 
  Customers customers = new  Customers();
  customers.setId(strcustomers);
  orders.setCustomers(customers);
  orders.setOrderNumber(strorder_number);
  ordersDAO.attachDirty(orders);

在这里的持久化对象的生命周期里,当Customers customers = new  Customers();时,Customers还属于临时状态,而到了sessionv.save(customers);的时候Customers由临时状态转变为持久化状态。临时状态时不处于Session缓存中,转化为持久化状态后Customers就加入到了Session缓存中,在此Customers customers 2=(Customers)session.load(Customer.class,id);、Customers customers 3=(Customers)session.load(Customer.class,id);、均是在持久化状态。而直到session.close();就表明Customers退出了Session缓存,由持久化状态转变为游离状态。System.out.println(customers 3.getname());也是处于游离状态。到最后c2=null;c3=null;Customers生命周期结束。

Session有三种检索方法:load()、get()、find(),检索策略有类级别的:立即检索、延迟检索,关联级别的立即检索、延迟检索、迫切左外连接检索。在类级别中应该有线考虑使用立即检索。不管hbm文件里lazy属性是true还是false,Session的get()、find()方法总是使用立即检索策略。

在一对多关联级别中,对于<set>元素不能随意使用立即检索策略,尽量使用延迟检索策略。应用程序如果新闻访问游离状态的代理类实例,必须保证它在持久化状态时已经被初始化,不然会抛出异常

对于多对一或一对一关联,应该优先考虑使用外连接检索策略,因为它比立即检索策略使用的select语句数目少。在默认情况下<many-to-one>元素的outer-join属性为auto,<class>元素的lazy属性为false,因此默认使用迫切外连接检索策略。迫切外连接检索策略受数据库表的大小和连接影响,如果select语句中的外连接表的数目太多,会影响检索性能,可以通过Hibernate配置文件中的hibernate.max_fetch_depth来达到优化。hibernate.max_fetch_depth取决数据库连接性能及表大小。

这篇关于070827 hibernate关联、联级操作、对象生命周期、检索策略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903395

相关文章

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看