一.对象关系映射基础
1.hibernate对象属性映射
映射文件中,<property>元素的access属性用于指定Hibernate访问持久化类的属性的方式。有以下两种可选值:
property:这是默认值,表示是通过属性相应的get,set方法来访问属性。
field:表面是运用Java反射机制直接访问类的属性,此属性可以没有get,set方法。
例如:<property name="name" access="field"/>
这样设置是直接通过属性值取得,可以没有get,set方法。
反之name则是根据set,get后的Name对应,配置文件的name名可以不跟实体bean里的属性名直接对应。
我们常用的hql语句例如:List customers = session.find("from Customer as c where c.name = 'Tom'");
这里的c.name中的name名字是根据配置文件里的name所对应,并不是和实体bean里的属性名对应。
2.在持久化类的访问方法中加入程序逻辑
(1)hibernate在执行find方法时候会调用bean中的set方法把查询出的内容放入属性中,提供给我们获取其中的值。
在执行save,update等方法时候会调用bean中的get方法获得我们提交的数据进行持久化操作。
所以,可以通过在set,get方法中加入相应我们需要的逻辑,如果不需要让hibernate在执行查询或保存操作时候隐式的调用get,set方法,
可以在映射文件中设置field参数
(2)利用<property>元素的formula属性。
如果数据表里没有totalPrice价格总和字段,而我们需要在获得用户对象的同时,需要知道它对应多个订单的价格总和,
我们可以在CUSTOMER实体bean里定义totalPrice属性,生成get,set方法,再利用以下代码可以实现
例如:<property name="totalPrice" formula="(select sum(o.PRICE) from ORDERS o where o.CUSTOMER_ID=ID)"/>
(3)控制insert和update语句
例如:<property name="price" update="false" insert="false" column="PRICE"/>
设置成false代表在保存或修改此类时候,price不被操作。一般多用于多对一关系映射中,避免级联操作。
二.关联映射
1.主键自动生成映射
<id name="id" type="java.lang.String" column="ID" length="32">
<generator class="uuid" />
</id>
2.一对一主键关联
<one-to-one name="order" class="mypack.Order" cascade="all"/>
constrained属性为true,表明ORDERS表的ID主键同时作为外键参照CUSTOMERS表。
当前xml文件中,必须为OID使用foreign标识符生成策略:
<one-to-one name="customer" class="mypack.Customer" constrained="true"/>
<id name="id" type="java.lang.String" column="ID">
<generator class="foreign">
<param name="property">customer</param>
</generator>
</id>
注:当两个关联类之间有两个一对一关联时,可以使用一对一外键关联。
一对一外键关联与多对一关联的区别仅仅是在many-to-one标签上需要配置属性unique="true"。
3.多对一关联
<many-to-one name="customer" class="mypack.Customer" column="CUSTOMER_ID"/>
4.一对多关联
<set name="orders" cascade="save-update" inverse="true" lazy="extra">
<key column="CUSTOMER_ID" />
<one-to-many class="mypack.Order"/>
</set>
<list name="orders" cascade="save-update" lazy="extra" fetch="join">
<key column="CUSTOMER_ID"></key>
<list-index column="SHOW_INDEX"></list-index> <!--orders表中索引位置字段SHOW_INDEX-->
<one-to-many class="mypack.Order" />
</list>
5.多对多关联
<set name="orders" table="CUSTOMERS_TO_ORDERS" cascade="save-update" lazy="extra">
<key column="CUSTOMER_ID"/> <!--双向多对多关联必须把其中一端的inverse属性设为true-->
<many-to-many class="mypack.Order" column="ORDER_ID"/>
</set>
注:当中间表需要有更多的属性字段时,可把多对多分解成两个一对多关联。
6.在数据库中对集合排序
set,map映射支持sort属性(内存排序),order-by属性(数据库排序)。
例如:
<set name="orders" cascade="save-update" inverse="true" lazy="extra" order-by="ID asc">
<key column="CUSTOMER_ID" /> <!--当加载Customer对象的orders集合的时,会进行排序操作-->
<one-to-many class="mypack.Order"/>
</set>
7.附加过滤条件
<set name="orders" cascade="save-update" inverse="true" lazy="extra" where="STATUS='1'">
<key column="CUSTOMER_ID" /> <!--当加载Customer对象的orders集合的时,只会查出STATUS为1的order对象-->
<one-to-many class="mypack.Order"/>
</set>
三.检索方式
1.分页查询
List result = this.getSession().createQuery("from Customer c order by c.name asc")
.setFirstResult(0).setMaxResults(10).list();
2.条件查询
//如果hql语句中含有参数可以使用以下方法提高安全性:
Object[] args = {name,order}; //传入的查询条件的变量名字
Type[] types = {Hibernate.STRING,Hibernate.entity(Order.class)}; //变量类型
//Type[]是hibernate提供的变量类型,order为自定义对象类型。
//根据参数说在位置的索引值,传入的变量名字,变量类型来进行查询。
List list = this.query("from Customer c where c.name=? and c.order=?",args,types)
public List query(String hql, Object[] args, Type[] types){
Query query = this.getSession().createQuery(hql);
query.setParameters(args, types);
return query.list();
}
3.批量延迟检索
映射文件中<set>元素有一个batch-size属性,用于为延迟检索或立即检索策略设定批量检索的数量。
注:批量检索的属性值范围不宜过大,如果过大就失去了延迟加载的意义,如果太小也会失去批量检索的意义。
一般设置为:3-10。合理的运用批量检索可以提高检索性能。具体请查阅说明文档。
4.检索单个对象
Customer customer = (Customer)this.getSession().createQuery("from Customer c order by c.name asc")
.setMaxResults(1).uniqueResult();
5.隐式内连接
//标准的HQL内连接查询语句:
"from Customer c inner join c.orders";
//如果Customer类中没有orders集合属性,可以采用SQL风格的隐式内连接查询语句:
"from Customer c,Order o where c.in=o.customer_id";
6.分组查询
//例如以下查询语句仅统计具有一条以上订单的客户的所有订单的总价:
"select c.id,c.name,sum(o.price) from Customer c join c.orders o group by c.id having (count(o)>1)";
7.HQL查询的select子句
"select new map(c.name as personName) from Customer c"
//HQL语句返回的结果是集合,其中集合元素是Map对象,以personName作为Map的key。
8.SQL查询通过对象属性显示
//SimpleJdbcTemplete是spring为hibernate查询提供的工具类
SimpleJdbcTemplete simpleJdbcTemplete;
List<Map<String,Object>> list = simpleJdbcTemplete.queryForList(sql.toString(), new Object[]{});
分享到:
相关推荐
### 马士兵Java框架Hibernate学习笔记 #### 一、HelloWorld - **知识点概述**: - **项目搭建**:介绍了如何从零开始搭建一个简单的Hibernate项目。 - **环境配置**:包括了如何配置MySQL数据库、创建必要的表...
5. **添加BaseDao与BaseDaoImpl**:设计通用的数据访问接口(BaseDao)及其实现类(BaseDaoImpl),封装常用的数据库操作方法。 6. **添加单元测试**:编写单元测试代码来验证数据库连接是否正确,以及基本的CRUD...
在提供的笔记中,"10-Struts高级部分(2)(常用Action、验证框架、动态Form)笔记.pdf"和"11-留言管理程序_使用Struts + DAO完成笔记.pdf"深入介绍了Struts的高级特性,如自定义Action、表单验证和动态Form的使用,...
J2EE三大框架_笔记 共分三块: J2EE框架_笔记_a: 1-JSP+JDBC_假分页笔记 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页...54留言管理程序_Struts + Spring + Hibernate笔记
J2EE三大框架_笔记 共分三块: J2EE框架_笔记_a: 1-JSP+JDBC_假分页笔记 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页...54留言管理程序_Struts + Spring + Hibernate笔记
- **提高开发效率:** 通过ORM技术,Hibernate允许开发者直接操作Java对象而不是SQL语句,从而显著提高了开发效率。 - **提高代码可维护性:** 由于减少了与数据库交互的代码量,因此提高了代码的可维护性和可扩展...
根据提供的信息,我们可以总结出以下关于达内HIBERNATE学习笔记的重要知识点: ### 第一章:Hibernate入门 #### 1.1 学习目标 - 理解Hibernate的基本概念。 - 掌握如何使用Hibernate进行开发。 #### 1.2 对象持久...
### JDBC与Hibernate学习笔记 #### 一、JDBC概述 **1.1 ODBC与JDBC的区别** - **ODBC(Open Database Connectivity)**: 开放式数据库连接是一种开放标准的应用程序接口(API),用于实现数据库应用程序与不同...
J2EE三大框架_笔记 共分三块: J2EE框架_笔记_a: 1-JSP+JDBC_假分页笔记 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页...54留言管理程序_Struts + Spring + Hibernate笔记
- **核心配置**: 介绍了`hibernate.cfg.xml`文件的结构及常用配置项。 通过以上步骤,我们可以成功地搭建一个基于Hibernate的开发环境,并实现对数据库的基本操作。Hibernate的学习不仅仅局限于这些基础知识,还...
### hibernate框架学习笔记整理 #### 一、Hibernate框架简介 **Hibernate框架**是一种用于Java应用的**对象关系映射**(Object-Relational Mapping, ORM)解决方案,它允许开发者使用面向对象的方式操作数据库中的表...
这篇学习笔记涵盖了广泛的Java和JavaEE相关技术,包括Unix、Spring、Struts、Ajax、Hibernate等核心组件。让我们深入探讨一下这些技术。 首先,Unix是一个强大的操作系统,是许多服务器和开发环境的基础。在"Unix...
**Hibernate学习笔记与大纲** Hibernate 是一款开源的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据,而无需过多关注底层的SQL语句。本笔记将深入...
54留言管理程序_Struts + Spring + Hibernate笔记.pdf 6-Struts标签-BEAN标签笔记.pdf 7-Struts标签 -LOGIC标签笔记.pdf 8-Struts标签- HTML标签笔记.pdf 9-Struts高级部分(1)(解决重复提交、上传组件)笔记.pdf
2. **熟悉 Hibernate API**:掌握常用的 API 方法,如 Session、SessionFactory、Query 等。 3. **关联映射的掌握**:学会定义实体间的关联关系,包括一对一、一对多、多对多等。 4. **检索方式的应用**:了解如何...
### Hibernate学习笔记精要 #### 一、HelloWorld与Hibernate入门 **HelloWorld**是学习任何新技术时的经典第一个程序,Hibernate也不例外。通过构建一个简单的Java项目`hibernate_0100_HelloWorld`,我们可以熟悉...
### Struts、Spring、Hibernate&Ajax 学习笔记总结 #### Struts 部分 **Struts** 是 Java 开源框架中最早出现且最具影响力的框架之一,它出自 Apache 组织,是 Java Web 应用开发的标准之一。Struts 以 MVC(Model...
在本学习笔记中,我们将深入探讨如何实现这一整合,以及 Spring 中用于简化 Hibernate 操作的 HibernateTemplate 类。 首先,Spring 作为一款全面的后端框架,它提供了 IoC(Inversion of Control,控制反转)和 ...
### hibernate-note学习笔记知识点详解 #### 一、对象持久化 **1.1 概述** 对象持久化是指将程序中的对象状态保存到非易失性存储中(如硬盘或磁盘等),以便在系统重启后仍能保留这些状态。这种技术常用于将对象的...