SlideShare uma empresa Scribd logo
1 de 193
精通 Hibernate java 对象持久化技术祥解 Hibernate 入门 OR 映射技术 通过 Hibernate API 操纵数据库 检索策略和方式 数据库事务、并发、缓存与性能优化 高级配置。
Hibernate 入门 ,[object Object],Hibernate 关系数据库 Customer 类 BusinessService 类 对象关系型映射 Hibernate API Hibernate 配置文件 Customers 表
Hibernate 入门 ,[object Object],hibernate.dialect=net.sf.hibernate.dialect.OracleDialect hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver hibernate.connection.url=jdbc:oracle:thin:peopres/peopres@127.0.0.1:1521:oracle9 hibernate.connection.username=peopres hibernate.connection.password=peopres hibernate.show_sql=true
Hibernate 入门 ,[object Object],public   class  Customer  implements  Serializable { private   static   final   long  serialVersionUID = 5431991012351413505L; private  Long id; private  String name; private  String email; …… public  Customer() { } public  Long getId() { return  id; } public   void  setId(Long id) { this .id = id; } public  String getName() { return  name; }
Hibernate 入门 ,[object Object],drop database if exists SAMPLEDB; create database SAMPLEDB; use SAMPLEDB; create table CUSTOMERS ( ID bigint not null primary key, NAME varchar(15) not null, EMAIL varchar(128) not null, PASSWORD varchar(8) not null,  PHONE int ,  ADDRESS varchar(255), SEX char(1) , IS_MARRIED bit, DESCRIPTION text, IMAGE blob, BIRTHDAY date, REGISTERED_TIME timestamp );
Hibernate 入门 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Hibernate 入门 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Hibernate 入门 ,[object Object],TIMESTAMP REGISTERED_TIME timestamp java.sql.TimeStamp registeredTime DATE BIRTHDAY date java.sql.Date birthday BLOB CLOB BIT CHAR(1) INT Varchar(15) Sql 类型 IMAGE DESCRIPTION IS_MARRIED SEX PHONE NAME Cutomers 字段名 binary text boolean character int string hibernate byte[] java.lang.String boolean char int java.lang.String java Phone Sex Married Description Name image Customer 类属性
Hibernate 入门 ,[object Object]
Hibernate 入门 ,[object Object]
Hibernate 入门 ,[object Object],1 、创建 configuration 对象,把 hibernate.properties 文件读入内存。 2 、 add (……)把映射文件读入内存 3 、 buildSessionFactory ()数据源。重量级对象。
Hibernate 入门 ,[object Object],[object Object],save() update() delete() load() find()
Hibernate 入门
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object]
第一章  Java 对象持久化概述 ,[object Object],数据库 应用程序层 数据库 表述层 应用程序层 双层体系结构 三层体系结构 表述层:提供与用户交互的 GUI 。 业务逻辑层:实现各种业务逻辑。 数据库层:负责存放和管理应用的持久性数据。
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第一章  Java 对象持久化概述 ,[object Object],[object Object],表述层 业务逻辑层 数据库层 表述层 业务逻辑层 持久化层 数据库层
第一章  Java 对象持久化概述 ,[object Object],应用 1 业务逻辑层 应用 2 业务逻辑层 应用 3 业务逻辑层 持久化层 (hibernate) 数据库 1 数据库 2 数据库 3 持久化层封装了数据访问的细节,为业务逻辑层提供了面向对象的 API 。完善的持久化层应该 达到的目标: 1. 代码重用性高,可完成所有的数据访问操作。 2. 如果需要的话,能够支持多种数据库平台。 3. 具有相对独立性,当持久化层变化时,不会影响上层实现。
第一章  Java 对象持久化概述 ,[object Object],[object Object],客户 Name age 订单 orderNumber price 1 *
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Customers 表 ID<PK> NAME AGE ORDERS 表 ID<pk> CustomerID<fk> Order_number price
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object]
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],关联可分为一对一、一对多和多对多。 还可分为单项关联和双向关联。 Order Customer
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],BusinessService Customer
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],Person hand:set Hand ……
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],Employee name HourEmployee rate SalaryEmployee salary
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],内存 Customer 对象 order 对象 数据库 持久化 重新加载到内存
第一章  Java 对象持久化概述 ,[object Object]
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],域模型 (对象、属性、关联、继承和多态) ORM API ORM  实现 关系数据模型 (表、字段、索引、主键和外键) 业务逻辑层 对象 - 关系映射文件 (xml) 持久化层 数据库层 参照 ORM  充当业务逻辑层和数据库层之间的桥梁
第一章  Java 对象持久化概述 ,[object Object],[object Object],域模型 Address 类 Province city street zipcode Customer 类 id name homeAddress comAddress 关系数据模型 Customer 类 ID …… HOME_PROVINCE HOME_CITY …… COM_PROVINCE COM_CITY …… 注:域模型中类的数目要比关系数据模型中 表的数目多。 表的列(字段) 表的行(记录) 表 面向关系概念 属性 类 对象 面向对象概念
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],public void deleteCustomer(Customer c){ Session session = getSession(); session.delete(c); } 执行步骤如下: 1. 运用反射机制,获得 Customer 对象的 Customer.class 类。 2. 参照映射文件得到 Customer 类对应的表的信息,以及和 Customer 类关联的类以及 相应的表信息。 3. 根据以上信息生成 SQL 语句。 4. 调用 hibernate API ,执行该语句。
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Hibernate 对 JDBC 做了轻量级的封装。所谓轻量级是 指 Hibernate 并没有完全封装 JDBC , java 应用既可以 通过 HibernateAPI 来访问数据库,还可直接通过 JDBC  API 访问数据库。
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Query.setParameter(“name”,”name”,Hibernate.STRING)
第一章  Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Java 对象持久化概述 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Java 对象持久化概述 ,[object Object],表现层 业务逻辑层 持久化层 (orm 中间件、负责封装数据访问细节 ) 数据库层 实体域对象 ( 业务数据 ) 过程域对象 ( 业务逻辑 )
第四章 对象 - 关系映射基础 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第四章 对象 - 关系映射基础 ,[object Object],[object Object],[object Object],[object Object],Customer 对象 getXXX() 方法 setXXX() 方法 hibernate Java 应用程序 用户 界面 数据库 Java 应用程序不能访问持久化类的 private 方法,而 hibernate 没有这 个限制,它可以访问各种级别的方法。
第四章 对象 - 关系映射基础 ,[object Object],[object Object],[object Object],<property name=“price” type=“double” column=“PRICE” /> 基本类型可直接运算、无法表达 null 、数字类型的默认值为 0 。 包装类默认值是 null 。当对于默认值有业务意义的时候需要使用包装类。
第四章 对象 - 关系映射基础 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],<property name=“name” access=“field” /> 除了设置 property 属性的 access 为 field 和 property 之外 还可以自定义访问策略,需要创建实现 net.sf.hibernate. property.PropertyAccessor 接口的类 。
第四章 对象 - 关系映射基础 ,[object Object],[object Object],class Customer{ … .. private String firstname ; private String lastname ; public String getName(){ return firstname + “ ” + lastname ; } public void setName(String name){ StringTokenizer t = new StringTokenizer(name); firstname = t.nextToken(); lastname = t.nextToken(); } }
第四章 对象 - 关系映射基础 ,[object Object],[object Object],[object Object],<property name =“name” column=“NAME” /> 尽管类中并没有 name 属性,由于 hibernate 不是直接访问 Name 属性,而是调用 get 、 set 方法,因此建立了 Firstname 、 Lastname 和表之间的联系。 Hibernate getName() setName() CUSTOMERS 表 Name 字段 Customer 类 firstname lastname
第四章 对象 - 关系映射基础 ,[object Object],[object Object],[object Object],Session.find(“from customer as c where c.name=‘tom’”) 如果改成: <property name=“name” column=“NAME” access=“field”> 后过如何?
第四章 对象 - 关系映射基础 ,[object Object],[object Object],[object Object],Public void setOrders(Set orders){ this.orders = orders ; calprice(); } Public calprice(){ …… setAvgPrice(avgprice); }
第四章 对象 - 关系映射基础 ,[object Object],[object Object],[object Object],Public void setSex(char sex){ if(sex != ‘M’ && sex != ‘F’){ throw new IllegalArgumentException(“Invalid sex”); } this.sex = sex; }
第四章 对象 - 关系映射基础 ,[object Object],[object Object],[object Object],<property name=“totalprice”  formula=“(select sum(o.PRICE) from ORDERS o where o.CUSTOMER_ID=ID)” /> <property name=“unitprice”  formula=“BASE_PRICE*QUANTITY” />
第四章 对象 - 关系映射基础 ,[object Object],[object Object],若为 true ,等价于所有的 <property> 元素的 dynamic-update 为 true ,更新一个对象时,动态生成 update 语句,语句中仅包含取值不为 null 的字段。默认 false 。 若为 true ,等价于所有的 <property> 元素的 dynamic-insert 为 true ,保存一个对象时,动态生成 insert 语句,语句中仅包含取值不为 null 的字段。默认 false 。 若为 true ,更新一个对象时,会生成动态 update 语句,只有这个字段取值不为 null 才会把它包含到 update 语句中。默认为 false 。 若为 true ,保存一个对象时,会生成动态 insert 语句,只有这个字段取值不为 null 才会把它包含到 insert 语句中。默认为 false 。 若为 false ,等价于所有的 <property> 元素的 update 属性为 false ,整个实例不能被更新。默认为 true 。 若为 false , update 语句不包含该字段,该字段永远不能被更新。默认值为 true 。 若为 false ,在 insert 语句中不包含该字段,该字段永远不能被插入。默认值 true 。 作用 <property> insert 属性 <property> update 属性 <class> mutable 属性 <property> dynamic-insert 属性 <property> dynamic-update 属性 <class> dynamic-insert 属性 <class> dynamic-update 属性 映射属性
第四章 对象 - 关系映射基础 ,[object Object],[object Object],<property name=“description” column=“`CUSTOMER DESCRIPTION`” />
第四章 对象 - 关系映射基础 ,[object Object],[object Object],<hibernate-mapping package=“mypack”> <class name=“customer” table=“cu..” > …… </class> </hibernate-mapping> <hibernate-mapping> <class name=“mypack.customer” table=“cu..” > …… </class> </hibernate-mapping>
第五章 映射对象标识符 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第五章 映射对象表示符 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第五章 映射对象表示符 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第五章 映射对象表示符 ,[object Object],[object Object]
第五章 映射对象标识符 ,[object Object],[object Object],Customer c1 = (Customer)session.load(Customer.class,new Long(1)); Customer c2 = (Customer)session.load(Customer.class,new Long(1)); Customer c3 = (Customer)session.load(Customer.class,new Long(3)); c1 == c2 ? c1 == c3 ? <id name=“id” type=“long” column=“ID”> <generator class=“increment” /> </id> <generator> 子元素用来设定表示符生成器。 Hibernate 提供了表识符生成器接 口: net.sf.hibernate.id.IdentifierGenerator, 并提供了多种内置的实现。
第五章 映射对象标识符 适用于自然主键。由 java 程序负责生成标识符。不能把 setID() 方法声明为 Private 的。尽量避免使用自然主键。 适用于代理主键。 Hibernate 采用 128 位的 UUID 算法来生成标识符。该算法 能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。 适用于代理主键。根据底层数据库对自动生成表示符的能力来选择 identity 、 sequence 、 hilo 适用于代理主键。 Hibernate 根据 hign/low 算法生成标识符。 Hibernate 把特定表的字段作为“ hign” 值。默认情况下,采用 hibernate_unique_key 表的 next_hi 字段。 适用于代理主键。 Hibernate 根据底层数据库序列生成标识符。条件是数据库支持序列。 适用于代理主键。由底层数据库生成表识符。条件是数据库支持自动增长数据类型。 适用于代理主键。由 hibernate 自动以递增的方式生成表识符,每次增量为 1 描述 Increment Identity Sequence Hilo Uuid.hex Native assigned 表示符生成器
第五章 映射对象表示符 ,[object Object],[object Object],select max(id) from table; <id name=“id” type=“long” column=“ID”> <generator class=“increment”/> </id> 适用范围: 1 。由于不依赖与底层数据库,适合所有的数据库系统。 2 。单个进程访问同一个数据库的场合,集群环境下不推荐适用。 3 。 OID 必须为 long 、 int 或 short 类型,如果把 OID 定义为 byte 类型,抛异常。
第五章 映射对象表示符 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第五章 映射对象表示符 ,[object Object],[object Object],<id name=“id” type=“long” column=“ID”> <generator class=“sequence”> <param name=“sequence”>tester_id_seq</param> </generator> </id> 适用范围: 地层数据库要支持序列。 Oracle DB2 SAP 等。 OID 必须为 long 、 int 或 shot 类型。
第五章 映射对象表示符 ,[object Object],[object Object],<id name=“id” type=“long” clomn=“ID”> <generator name=“hilo”> <param name=“table”>hi_value</param> <param name=“column”>next_value</param> <param name=“max_lo”>100</param> </generator> </id> 使用范围: 该机制不依赖于地层数据库,因此适用于所有的数据库系统。 OID 必须为 long 、 int 、 short 类型,如果为 byte 类型的话,会抛出异常。 Net.sf.hibernate.id.IdentifierGeneratorException:this id generator generates Long 、 integer 、 short 。
第五章 映射对象表示符 ,[object Object],[object Object],<id name=“id” type=“native” column=“ID”> <generator class=“native” /> </id> 适用范围: 该类型能根据地层数据库系统的类型,自动选择合适的标识符生成器,因此很适合于跨数据 库的平台,即在同一个应用中需要连接多种数据库系统的场合。 OID 与以上类同。
第五章 映射对象表示符 ,[object Object],[object Object],<id name=“id” column=“NAME” type=“string”> <generator class=“assigned” /> </id> <version name=“version” column=“VERSION” unsaved-value=“0” />
第五章 映射对象表示符 ,[object Object],[object Object],<composite-id> <key-property name=“name” column=“NAME” type=“string”> <key-property name=“companyId” column=“COMPANY_ID” type=“long”> </composite-id> <version name=“version” column=“VERSION” unsaved-value=“0” /> 使用联合主键的持久化类需要实现 serializable 接口和覆盖 equals() 、 hashCode() 方法。 可以使用 customId 属性来设置连联合主键 <composite-id name=“costomerid” class=“mypack.CustomerId”> <key-property name=“name” column=“NAME” type=“string”> <key-property name=“companyId” column=“COMPANY_ID” type=“long”> </composite-id>
第六章 映射一对多关联关系 Order 到 Customer 的多对一单向关联 Customer  到 Order 的一对多单向关联 Customer  到 Order 的一对多双向关联
第六章 映射一对多关联关系 ,[object Object],<many-to-one name=“customer”  column=“CUSTOMER_ID”  class=“..Customer” not-null=“true”> <property name=“***”> ?
第六章 映射一对多关联关系 ,[object Object],many-to-one 属性 : name: 设定待映射的持久化类的名字。 column: 设定和持久化类的属性对应的表的外键。 class: 设定持久化类的属性的类型。 not-null: 是否允许为空。
第六章 映射一对多关联关系 tx = session.beginTransaction(); Customer c =  new  Customer(); c.setName(&quot;TOM&quot;); session.save(c); ? 会有什么后果 Order o1 =  new  Order(); o1.setOrderNumber(&quot;1&quot;); o1.setCustomer(c); Order o2 =  new  Order(); o2.setOrderNumber(&quot;1&quot;); o2.setCustomer(c); session.save(o1); session.save(o2); tx.commit();
第六章 映射一对多关联关系 ,[object Object],[object Object],tx = session.beginTransaction(); Customer c =  new  Customer(); c.setName(&quot;TOM&quot;); //session.save(c); ? 会有什么后果 Order o1 =  new  Order(); o1.setOrderNumber(&quot;1&quot;); o1.setCustomer(c); Order o2 =  new  Order(); o2.setOrderNumber(&quot;1&quot;); o2.setCustomer(c); session.save(o1); session.save(o2); tx.commit();
第六章 映射一对多关联关系 ,[object Object],[object Object],[object Object],<many-to-one name=“customer”  column=“CUSTOMER_ID”  class=“..Customer” cascade=“save-update” not-null=“true” /> <property name=“***”> ?
第六章 映射一对多关联关系 ,[object Object],Class Customer{ … public Set orders = new Set(); public Set getOrders(){ return orders; } public void setOrders(Set orders){ this.orders = orders; } … } <set name=“orders”  cascade=“save-update”> <key column=“CUSTOMER_ID” /> <one-to-many class=“..Order” /> </set> Customer c = new Customer(“TOM”); Order o1 = new Order(“11”); O1.setCustomer(c); c.getOrders().add(o1); session.save(c); tx.commit();
第六章 映射一对多关联关系 ,[object Object],[object Object],[object Object],[object Object],[object Object]
第六章 映射一对多关联关系 ,[object Object],<set name=“orders”  cascade=“save-update”> <key column=“CUSTOMER_ID” /> <one-to-many class=“..Order” /> </set> name: 设定待映射持久化类的属性名。 cascade: 设定级联操作的程度。 key 子属性 : 设定与所关联的持久化类对应的标 的外键。 one-to-many 子属性 : 设定所关联的持久化类。
第六章 映射一对多关联关系 ,[object Object],[object Object],Customer c = (Customer)session .load(Customer.class,new Long(2)); Order o = (Order)session.load(Order.class,new Long(2)); o.setCustomer(c); c.getOrders().add(o); tx.commit(); -------------------------------------------------------------- Update orders set …... Update orders set …… hibernate 执行两条更新语句。
第六章 映射一对多关联关系 ,[object Object],[object Object],Hibernate 会自动清理缓存中的所有持久化对象,按照持久化对象的改变 来同步更新数据库,因此执行了上述的两条更新语句。 重复执行多余的 sql 语句会影响 java 性能,解决这也问题的办法是把 <set> 元素的 inverse 属性设为 true, 该属性的默认值是 false 。 <set name=“orders” cascade=“save-update”  inverse=“true” > <key column=“CUSTOMER_ID” /> <one-to-many class=“mypack.Order” /> </set> Customer 和 order 的双向关联中, customer 端的关联只是 order 端关联 的镜像。当 hibernate 同时探测到持久化对象 customer 和 order 的状态均 发生变化时,仅按照 order 对象状态更新数据库。
第六章 映射一对多关联关系 ,[object Object],[object Object],Customer c = (Customer)session.load(…)); Order o = (Order)session.load(…); o.setCustomer(c); //c.getOrders().add(c); tx.commit(); -------------------------------------------------------------------- 以上代码仅设置了 order 对象的 customer 属性, hibernate 仍然会按照 order 对象的状态 的变化来同步更新数据库,执行以下 sql 语句: Update orders set order_number=‘…’,customer_id=2 where id = 2
第六章 映射一对多关联关系 ,[object Object],[object Object],Customer c = (Customer)session.load(……); Order o = (Order)session.load(……); //o.setCustomer(c); c.getOrders().add(c); tx.commit(); -------------------------------------------------------------------- 以上代码仅设置了 customer 对象的 orders 属性,由于 <set> 元素的 inverse 属性为 true ,因此, hibernate 不会按照 customer 对象的状态 变化来同步更新数据库。
第六章 映射一对多关联关系 ,[object Object],[object Object],结论: 1. 在映射一对多的双向关联关系时,应该在 one 方把 inverse 属性设为 true ,这可以提高性能。 2. 在建立两个对象的关联时,应该同时修改关联两端的相应 属性: Customer.getOrders().add(order); Order.setCustomer(customer); 这样才会使程序更加健壮,提高业务逻辑层的独立性,使业务 逻辑层的程序代码不受 Hibernate 实现类的影响。同理,当删 除双向关联的关系时,也应该修改关联两端的对象的相应属性: Customer.getOrders().remove(order); Order.setCustomer(null);
第六章 映射一对多关联关系 ,[object Object],[object Object],Customer customer = (Customer)session.load(Customer.class,new Long(2)); Session.delete(customer); tx.commit(); -------------------------------------------------------------------------------------- 如果 cascade 属性取默认值 none ,不会自动删除和 customer 关联的其他持久化对象。如 果希望删除 customer 时,自动删除和 customer 关联的 order 对象,可把 cascade 属性设 为 delete 。 <set name=“orders” cascade=“delete” inverse=“true”> <key column=“CUSTOMER_ID” /> <one-to-many class=“mypack.Order” /> </set> 再运行删除方法的时候,会自动删除 order 对象,此时 hibernate 执行如下语句: Delete from customer where customer_id = 1; Delete customer where id = 1;
第六章 映射一对多关联关系 ,[object Object],[object Object],Customer customer = (Customer)session.load(……); Order order = (Order)customer.getOrders().iterator().next(); // 删除关联关系 customer.getOrders().remove(order); order.setCustomer(null); tx.commit(); -------------------------------------------------------------------------------------- 如果 cascade 为默认值 none , hibernate 会执行如下语句: Update orders set Customer_id = null where ID = 2; 如果希望程序自动删除不再和 customer 关联的 order 对象,可以把 cascade 属性设为 all-delete-orphan 。 <set name=“orders” cacade=“add-delete-orphan” inverse=“true”> <key column=“CUSTOMER_ID” /> <one-to-many class=“mypack.Order” /> </set> Delete from orders where CUSTOMER_ID = 2 and ID = 2
第六章 映射一对多关联关系 ,[object Object],[object Object],当 customer.hbm.xml 的 <set> 元素的 cascade 属性取值为 all-delete-orphan,Hibernate 会按照如下方式处理 customer 对象: 1. 当保存或更新 customer 对象时,级联保存或更新所有关联的 order 对象,相当于 save-update. 2. 当删除 customer 对象时,级联删除所有的 order 对象,相当于 delete 。 3. 删除不再和 customer 对象关联的所有 order 对象。 当关联双方存在父子关系时,就可以把父方的 cascade 属性设为 all-delete-orphan. 所谓父子关系:是指父方来控制子方的持久化生命周期,子方对象必 须和一个父方对象关联。
第七章 操纵持久化对象 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第七章 操纵持久化对象 ,[object Object],Customer c = new Customer(“TOM”,new HashSet()); Order o1 = new Order(“Tom_order001”,null); Order o2 = new Order(“Tom_order002”,null); o1.setCustomer(c); c.getOrders().add(o1); o1 = null; o2 = null; c = null;
第七章 操纵持久化对象 ,[object Object],[object Object],[object Object]
第七章 操纵持久化对象 ,[object Object],Customer c = new Customer(“TOM”,new HashSet()); session.save(c); Long id = c.getId(); c = null; Customer c2 = (Customer)session.load(Customer.class,id); tx.commit(); session.close(); c2.getName(); C2 = null; --------------------------------------------------------------------------------------------- 缓存的作用: 1 。减少访问数据库的频率。 2 。保证缓存中的对象与数据库中的相关记录保持同步。 3 。当缓存中的持久化对象之间存在循环关联关系时, Session 会保证不出现访问对象图的死循 还,以及由死循环引起的 JVM 堆栈溢出异常。 提示: 当 session 加载了 customer 对象后,会为 customer 对象的值类型的属性复制一份快照。当清理 缓存时,通过比较对象的当前属性和快照,来判断对象的那些属性发生了变化。
第七章 操纵持久化对象 ,[object Object],Session 在清理缓存时,按照以下顺序执行 sql 语句。 1 。按照应用程序调用 save ()方法的先后顺序,执行所有的对实体进行插入的 insert 语句。 2 。所有对实体进行更新的 update 语句。 3 。所有对实体进行删除的 delete 语句。 4 。所有对集合元素进行删除、更新或插入的 sql 语句。 5 。执行所有对集合进行插入的 insert 语句。 6 。按照应用程序调用 delete ()方法的先后执行。 默认情况下: 1 。当应用程序 commit ()方法的时候,先清理缓存,然后在向数据库提交事务。 2 。当调用 find ()或 iterator ()时,如果对象属性发生变化,会先清理缓存,以保证查询结果 能够反映持久化对象的最新状态。 3 。显式调用 flush ()。 --------------------------------------------------------------------------------------------- 提示: Commit ()和 flush ()方法的区别: Flush 进行清理缓存的操作,执行一些列 sql 语句,但不提交事务; commit 方法先调用 flush 方 法,然后提交事务。提交事务意味着对数据库操作永久保存下来。
第七章 操纵持久化对象 ,[object Object],[object Object],清理 清理 清理 Session 的 flush () 不清理 清理 清理 Session 的 commit () 不清理 不清理 清理 Session 的 查询方法 FlushMode.AUTO FlushMode.COMMIT FLushMode.NEVER 清理缓存的模式
第七章 操纵持久化对象 ,[object Object],临时状态 (transient) :刚刚用 new 语句创建,没有被持久化,不处于 session 中。该对象 成为临时对象 持久化状态 (persistent) :已经被持久化,加入到 session 的缓存中。该状态的对象为持久 化对象。 游离状态 (detached) :已经被持久化,但不处于 session 中。该状态的对象为游离对象。
第七章 操纵持久化对象 结束生命周期 结束生命周期 c2 = null; 处于游离态 转变为游离态 处于持久化状态 转变为持久化状态 临时状态 状态 处于生命周期中 处于生命周期中 处于生命周期中 处于生命周期中 开始生命周期 生命周期 tx = session.beginTransaction(); Customer c = new Customer(“Tom”,new HashSet); Session.save(c) Long id=c.getId(); c = null; Customer c2 = (Customer)session.load(Customer.class,id); tx.commit(); session.close(); c2,getName(); 程序代码
第七章 操纵持久化对象 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第七章 操纵持久化对象 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第七章 操纵持久化对象 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第七章 操纵持久化对象 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第七章 操纵持久化对象 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第七章 操纵持久化对象 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第七章 操纵持久化对象 ,[object Object],[object Object],[object Object],临时对象判断法: 1 。 OID 为 null 2 。具有 version 属性并取值为 null 3 。在映射文件中为 <id> 元素设置了 unsaved-value 属性,并且 OID 属性取值与属 性匹配。 4 。在映射文件中为 <version> 元素设置了 unsaved-value 属性,并且 version 属性取 值与属性匹配。 5 。自定义了 Interceptor 实现类,并且 isUnsaved 方法返回 Boolean.true 如果 id 的类型为 long ,则默认值为 0 ,此时需要在配置文件中设置 id 的 unsaved-value 为 0 。
第七章 操纵持久化对象 ,[object Object],[object Object],[object Object],[object Object],[object Object]
第七章 操纵持久化对象 ,[object Object],[object Object],[object Object]
第七章 操纵持久化对象 ,[object Object],包含 all 和 delete-orphan 的行为。 all-delete-orphan 删除所有和当前对象解除关联关系的对象。 包含 save-update 和 delete 的行为。 删除对象时,级联删除关联的对象。 保存或更新当前对象时,级联保存关联的临时对象,更新关联的游离对象。 忽略关联对象,默认值 描述 none save-update delete delete-orphan all cascade 属性值
第七章 操纵持久化对象 ,[object Object],Session.save(c); Session.flush(); Session.refresh(c); ----------------------------------------------------------------- 触发器的行为导致缓存与数据库中的数据不一致。解决办法是执行完 操作后,立即调用 session 的 flush 方法和 refresh 方法,迫使缓存与 数据库同步。 Session 的 update 操作方法盲目的激活触发器 如果游离状态的对象的属性和数据库一致,则更新操作是多余的。 为避免这种情况: <class name=“” table=“” select-before-update=“true”> …… </class>
第七章 操纵持久化对象 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第七章 操纵持久化对象 ,[object Object],Inteceptor 1.findDirty(): 查脏对象 2.Instantiate ():构造实例前调用 3.isUnsaved (): saveorupdate 方法调用该方法,判断用 save 还是 update 4.onDelete :删除对象前调用 5.onFlushDirty : flush 方法检查到脏对象时调用此方法。 6.onLoad ():初始化持久化对象时调用此方法。 7.onSave(): 保存对象前调用该方法。 8.postFlush ():执行完 flush 方法之前调用本方法。
public class AuditLogInterceptor implements Interceptor, Serializable { private Session session; private Set inserts=new HashSet(); private Set updates=new HashSet(); public void setSession(Session session){ this.session=session; } public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types){ if ( entity instanceof Auditable ) { updates.add(entity); } return false; } public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { return false; } public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { if ( entity instanceof Auditable ) { inserts.add(entity); } return false; } public void postFlush(Iterator entities) { try{ Iterator it=updates.iterator(); while(it.hasNext()){ Auditable entity=(Auditable)it.next(); AuditLog.logEvent(&quot;update&quot;,entity,session); } it=inserts.iterator(); while(it.hasNext()){ Auditable entity=(Auditable)it.next(); AuditLog.logEvent(&quot;insert&quot;,entity,session); } }catch(Exception e){e.printStackTrace();} finally{ inserts.clear(); updates.clear(); } } }
第七章 操纵持久化对象
第八章 映射组成关系
第八章 映射组成关系 Class customer{ …… Address homeAddress ; Address comAddress ; …… } Table customers{ …… home_province home_city home_street com_province com_city com_street  …… } <compont name=“homeaddress” class=“mypack.Address”> <parent name=“customer” /> <property name=“street” type=“string” column=“HOME_STREET” /> <property name=“city” type = “string” cloumn=“HOME_CITY” /> <property name=“street” type = “string” cloumn=“HOME_STREET” /> </component> <compont name=“comaddress” class=“mypack.Address”> <parent name=“customer” /> <property name=“street” type=“string” column=“COM_STREET” /> <property name=“city” type = “string” cloumn=“COM_CITY” /> <property name=“street” type = “string” cloumn=“COM_STREET” /> </component>
第八章 映射组成关系 ,[object Object],[object Object],[object Object]
第八章 映射组成关系 ,[object Object],[object Object],1.Conf.addClass(Customer.class).addClass(Address.class); 抛映射异常,原因是 Address.hbm.xml 文件没找到。 2. Customer c = new Customer(); c.setHomeAddress(new Address()); c.setComAddress(new Address()); …… Session.save(c); ----------------------------------------------------------------------------------------- Session.save(new Address()); 映射异常: unkown entity class.
第八章 映射组成关系 ,[object Object],Computer 类和他的组件类
第八章 映射组成关系 ,[object Object],<component name=&quot;cpuBox&quot; class=&quot;mypack.CpuBox&quot;> <parent name=&quot;computer&quot; /> <property name=&quot;type&quot; type=&quot;string&quot; column =&quot;CPUBOX_TYPE&quot; /> <component name=&quot;graphicsCard&quot; class=&quot;mypack.GraphicsCard&quot;> <parent name=&quot;cpuBox&quot; /> <property name=&quot;type&quot; type=&quot;string&quot; column =&quot;GRAPHICSCARD_TYPE&quot; /> </component> <many-to-one   name=&quot;vendor&quot;   column=&quot;CPUBOX_VENDOR_ID&quot;   class=&quot;mypack.Vendor&quot;   not-null=&quot;true&quot;  /> </component>
第九章  Hibernate 映射类型 ,[object Object],布尔 CHAR(1) boolean Boolean true_false 布尔 BIT boolean Boolean boolean 布尔 CHAR(1) boolean Boolean yes_no 变长串 VARCHAR String string 定长字符 8 位含 2 位小数部分 8 4 1 2 8 4 取值范围 CHAR(1) NUMERIC DOUBLE FLOAT TINYINT SMALLINT BIGINT INTEGER sql char Character String java.math.BigDecinimal double Double float Float byte Byte short Short long Long int Integer java integer int  long short byte float double big_decimal character Hibernate
第九章  Hibernate 映射类型 ,[object Object],YYYY-MM-DD YYYYMMDDHHMMSS YYYYMMDDHHMMSS HH:MM:SS YYYY-MM-DD 取值范围 DATE TIMESTAMP TIMESTAMP TIME DATE sql java.util.Calendar java.util.Calendar util.Date sql.timestamp util.Date sql.Time util.Date sql.Date java date time timestamp calendar calendar_date Hibernate
第九章  Hibernate 映射类型 ,[object Object],不允许以上类型来定义 OID BLOB sql.Blob blob CLOB BARBINARY(BLOB) CLOB VARBINARY(BLOB) sql sql.Clob 实现类 String byte[] java binary text serializable clob Hibernate
第九章  Hibernate 映射类型 ,[object Object],如果持久化类的字段为 blob 或 clob 类型,保存时需要包含两步: ---------------------------------------------------------------------------------------------- Customer c = new Customer(); // 现保存一个空的 clob 实例 c.setDescription(Hibernate.createClob()); session.save(c); session.flush(); // 锁定记录 session.refresh(customer,LockMode.UPGRADE); oracle.sql.CLOB clob = c.getDescription(); // 写入大文本 java.io.Writer pw = clob.getCharacterOutputStream(); pw.write(longtext); pw.close(); tx.commit(); session.close();
第九章  Hibernate 映射类型 ,[object Object],VARCHAR VARCHAR VARCHAR VARCHAR sql java.util.Currency java.util.TimeZone java.util.Locale java.lang.Class java class locale timezone currency Hibernate
第九章  Hibernate 映射类型 ,[object Object],java 应用程序 java.lang.String hibernate hibernate 映射类型: string jdbc Driver 标准 sql 类型: varchar my sql 类型: varchar oracle : varchar2
第九章  Hibernate 映射类型 ,[object Object],customer 类 -------------------- id:Long email:String phone:Integer hibernate 内置类型 -------------------- long string ? customers 表 -------------------- ID BIGINT EMAIL VARCHAR(50) PHONE VARCHAR(8)
第九章  Hibernate 映射类型 ,[object Object]
第九章  Hibernate 映射类型 ,[object Object],1 。设置表中的字段类型。 private static final int[] sql_types = {Types.VARCHAR}; public int[] sqltypes(){ return sql_types}; 2. 设置 java 类型。 returnedClass(); 3. 是否是可变类 isMutable(); 4. 深度拷贝,生成快照。 deepCopy(); 5.equals() 方法判断字段属性是否和快照相同。 6. 调用 nullSafeGet() 方法来取得字段的属性值。 public Object nullSafeGet(ResultSet rs,String[] names,Object owner){ if(rs.wasNull()) return null; String phone = rs.getString(name[0]); return new Integer(phone); } 7. 调用 nullSafeSet 方法来把 phone 属性添加到 insert  语句中。 ----------------------------------------------------------------------------------------------- <property name=“phone” type=“mypack.PhoneType” column=“PHONE” />
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
<property name=&quot;name&quot; type=&quot;mypack.NameCompositeUserType&quot; > <column name=&quot;FIRSTNAME&quot; length=&quot;15&quot; /> <column name=&quot;LASTNAME&quot; length=&quot;15&quot; /> </property> <property name=&quot;homeAddress&quot; type=&quot;mypack.AddressUserType&quot; > <column name=&quot;HOME_STREET&quot; length=&quot;15&quot; /> <column name=&quot;HOME_CITY&quot; length=&quot;15&quot; /> <column name=&quot;HOME_PROVINCE&quot; length=&quot;15&quot; /> <column name=&quot;HOME_ZIPCODE&quot; length=&quot;6&quot; /> </property> <property name=&quot;comAddress&quot; type=&quot;mypack.AddressUserType&quot; > <column name=&quot;COM_STREET&quot; length=&quot;15&quot; /> <column name=&quot;COM_CITY&quot; length=&quot;15&quot; /> <column name=&quot;COM_PROVINCE&quot; length=&quot;15&quot; /> <column name=&quot;COM_ZIPCODE&quot; length=&quot;6&quot; /> </property>
第十章  Hibernate 的检索策略 ,[object Object],类级别和关联级别可选的检索策略及默认的检索策略 load get find load 运行时行为受影响的 session 的检索方法 一对多和多对多为立即检索 多对一和一对一关联为外连接检索 立即 默认的检索策略 立即 延迟 迫切左外连接检索 立即 延迟 可选的检索策略 类级别 关联级别 检索策略的作用域
第十章  Hibernate 的检索策略 三种检索策略的运行机制 ,[object Object],通过左外连接加载与检索方法指定的对象关联的对象。 延迟加载与检索方法指定的对象关联对象。可设定批量检索数量。 立即加载关联的对象、可设定批量检索数量 关联接别 不适用 延迟加载检索方法指定的对象 立即加载检索方法制定的对象 类级别 立即 延迟检索 迫切左外 检索策略的类型
第十章  Hibernate 的检索策略 ,[object Object],映射文件中用于设定检索策略的几个属性 合理取值 3~10 之间, class 和 set 存在。 如果为 true ,适用迫切左外连接检索。在 <many-to-one> 和 <one-to-one> <set> 中存在。 如果为 true ,延迟加载, class 和 set 有此属性 描述 1 <many-to-one> 和 <one-to-one> 中为 auto , 在 <set> 元素中为 false 。 false 默认值 正整数 auto true false true false 可选值 lazy out-join batch-size 属性
第十章  Hibernate 的检索策略 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第十章  Hibernate 的检索策略 ,[object Object],无意义 延迟检索。 迫切左外联接。 立即检索 策略 true false true false out-join false false true true lazy
第十章  Hibernate 的检索策略 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第十章  Hibernate 的检索策略 ,[object Object],立即 延迟 迫切左外连接 迫切左外连接 迫切左外连接 延迟 检索 order 时对 customer 对象的检索策略 false true false true false true customer 类的 lazy 属性 auto auto true true false false order 类 <many-to-one> 的 outer-join 属性
第十章  Hibernate 的检索策略 ,[object Object],(1) 对应用程序完全透明,不管对象处于持久化状态还是游离状态,都可从一个对象导航到另一个对象。 (2) 使用了外连接, select 语句少 由应用程序决定需要加载哪些对象,可以避免执行多余的 select 语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并节省内存空间。 对应用程序完全透明,不管对象处于持久化状态还是游离状态,应用程序都可以从一个对象导航到关联的对象 优点 (1) 多对一或一对一关联 (2) 需要立即访问的对象 (3) 数据库有良好的表连接性能。 (1) 一对多或者多对多关联 (2) 应用程序不需要立即访问或者根本不会访问的对象 (1) 类级别 (2) 应用程序需要立即访问的对象 (3) 使用了二级缓存 优先考虑使用的场合 (1) 可能会加载应用程序不需要访问的对象,浪费内存。 (2) 复杂的数据库表连接也会影响检索性能。 应用程序如果希望访问游离状态的代理类实例,必须保证她在持久化状态时已经被初始化。 (1)select 语句多 (2) 可能会加载应用程序不需要访问的对象,浪费许多内存空间。 缺点 立即检索 延迟检索 迫切左外连接检索 检索策略
第十一章  hibernate 检索方式 ,[object Object],[object Object],[object Object],[object Object],[object Object]
第十一章  hibernate 检索方式 ,[object Object],[object Object],1 。在查询语句中设定各种查询条件 2 。支持投影,仅检索出对象的部分属性 3 。支持分页 4 。连接查询 5 。分组查询 6 。内置聚集函数 7 。调用用户自定义的函数 8 。嵌入式查询 9 。动态绑定参数 Query query = session.createQuery(“from Customer as c where c.name=:custoerNa me and c.age = :customerAge”); query.setString(“customerName”,”Tom”); query.setInteger(“customerAge,21); query.list();
第十一章  hibernate 检索方式 ,[object Object],[object Object],主要由 Criteria 、 Criterion 接口和 Expression 类组成,他支持在运行时动态生成查询语句。 ------------------------------------------------------------------------------------------ Criteria criteria = session.createCriteria(Customer.class); Criterion c1 = Expression.like(“name”,”T%”); Criterion c2 = Expression.eq(“age”,new Integer(21)); criteria.add(c1) criteria.add(c2); criteria.list(); ------------------------------------------------------------------------------------------ 方法链编程: session.createCriteria(Customer.class).add(Expression.like(“name”,”%T”)) .add(Expression.eq(“age”,new Integer(21))) .list();
第十一章  hibernate 检索方式 ,[object Object],[object Object],Query query = session.createSQLQuery(“select {c.*} from CUSTOMERS c where  c.NAME like :customerName and c.AGE=:customerAge”,”c”, Customer.class); // 动态绑定参数 query.setString(“customerName”,”T%”); query.setInteger(“customerAge”,new Integer()21); // 执行 sql select 语句,返回查询结果。 List list = query.list();
第十一章  hibernate 检索方式 ,[object Object],[object Object],from Customer as c where c.name = :customerName as  可省略。
第十一章  hibernate 检索方式 ,[object Object],[object Object],session.createQuery(“from Employee”); 查询出所有的实体 from java.lang.serializable (支持接口) from java.lang.Object
第十一章  hibernate 检索方式 ,[object Object],[object Object],hql  查询: session.createQuery(“from Employee c order by c.name”); qbc 查询: session.createCriteria(Customer.class) .addOrder(Order.asc(“name”)); ,[object Object],[object Object],hql  查询: session.createQuery(“from Employee c order by c.name”).setFirstResult(97) .setMaxResults(10); qbc 查询: session.createCriteria(Customer.class) .addOrder(Order.asc(“name”)) .setFirstResult(97).setMaxResult(10).list();
第十一章  hibernate 检索方式 ,[object Object],[object Object],hql  查询: session.createQuery(“from Employee c order by c.name”) .setMaxResults(1).uniqueResult(); qbc 查询: session.createCriteria(Customer.class) .addOrder(Order.asc(“name”)) .setMaxResult(1).uniqueResult();
第十一章  hibernate 检索方式 ,[object Object],[object Object],hql  查询: session.createQuery(“from Employee c where c.name =:customerName”); query.setString(“customer”,”Tom”); ---------------------------------------------------- ............................c.name=? query.setString(0,”Tom”);
第十一章  hibernate 检索方式 ,[object Object],[object Object],<class> ....... </class> <query name=“findCustomersByName”> <![CDATA[from Cusomter c where c.name like:name]]> </query> ------------------------------------------------------------------ query = session.getNamedQuery(“findCustomersByName”); query.setString(“name”,”Tom”); query.list();
第十一章  hibernate 检索方式 ,[object Object],Express.not(Express.in()) not in Express.between() between Express.not(Express.between()) not between 含义 Express.in() Express.isNotNull() Express.isNull() Express.le() Express.lt() Express.ge() Express.not(Express.eq()) Express.eq() QBC 运算方法 in is not null is null <= < >= <> = HQL 运算符 比较运算 范围运算符 运算类型
第十一章  hibernate 检索方式 ,[object Object],Expression.or()| Expression.disjunction() or Expression.not() not 含义 Expression.and()| Expression.conjunction() Expression.like() QBC 运算方法 and like HQL 运算符 字符串模式匹配 逻辑 运算类型
第十一章  hibernate 检索方式 ,[object Object],适用于不存在关联关系的持久化类 不支持 ClassA,ClassB 交叉连接 不支持 right out join | out join 右外连接 迫切左外连接 左外连接 隐式内连接 不支持 不支持 left out join  out join FetchMode.EAGER left out join fetch out join fetch 适用于由关联关系的持久化类 适用范围 不支持 Criteria.createAlias() QBC 语法 inner join fetch | join fetch inner join | join HQL 语法 内连接 迫切内连接 程序中指定的连接查询类型
第十一章  hibernate 检索方式 ,[object Object],[object Object],HQL: createQuery(“from Customer c left outer join fetch c.orders o where c.name like ‘T%’”); QBC: createCriteria(Customer.class).setFetchMode(“orders”,FetchMode.EAGER) .add(Expression.like(“name”,”T”,MatchMode.START))
第十一章  hibernate 检索方式 ,[object Object],[object Object],HQL: createQuery(“from Customer c left join c.orders o where c.name like ‘T%’”);
第十一章  hibernate 检索方式 ,[object Object],[object Object],HQL: createQuery(“from Customer c inner join c.orders o where c.name like ‘T%’”); HQL: createQuery(“from Customer c join c.orders o where c.name like ‘T%’”); QBC: createCriteria(Customer.class). .add(Expression.like(“name”,”T”,MatchMode.START)) .createCriteria(“orders”) .add(Expression.like(“orderNumber”,”T”,MatchMode.START));
第十一章  hibernate 检索方式 ,[object Object],[object Object],HQL: createQuery(“from Customer c inner join fetch c.orders o where c.name like ‘T%’”); QBC: createCriteria(Customer.class). .setFetchMode(“orders”,FetchMode.EAGER) .createAlias(“orders”,”o”) .add(Expression.like(“this.name”,”T”,MatchMode.START)) .add(Expression.like(“o.orderNumber”,”T”,MatchMode.START))
第十一章  hibernate 检索方式 ,[object Object],[object Object],HQL: createQuery(“from Order o where o.customer.name like ‘T%’“); 等价于 : from Order o join o.customer c where c.name like ‘T%’ QBC: 不支持
第十一章  hibernate 检索方式 ,[object Object],[object Object],HQL: from Customer c right outer join c.orders o where o.name like ‘T%’  等价于 : from Customer c right join c.orders o where o.name like ‘T%’
第十一章  hibernate 检索方式 ,[object Object],[object Object],HQL: 交叉连接查询 :from Customer,Order  标准 SQL 风格的内连接 :from Customer c inner join c.orders SQL 风格的隐式内连接查询 :from Customer c,Order o where c.id = o.customer_id
第十一章  hibernate 检索方式 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第十一章  hibernate 检索方式 ,[object Object],[object Object],[object Object],[object Object],from Customer c join c.orders o where o.orderNumber like ‘T%’ 如果希望查询结果中只包含 Customer 对象,可使用以下形式: select c from Customer c join c.orders o where o.orderNumber like T%’ session.createQuery(“select c.id,c.name,o.orderNumber from Customer c join c.orders o where o.orderNumber like ‘T%’”) ----------------------------------------------------------------------------------- 对应的 sql 语句为: select c.ID,c.NAME,o.ORDER_NUMBER from CUSTOMERS c inner join  ORDERS o on c.ID-=o.CUSTOMER_ID where o.ORDER_NUMBER like’T%’ ------------------------------------------------------------------------------------ 过滤重复元素 createQuery(“select distinct c.name from customer c”);
第十一章  hibernate 检索方式 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第十一章  hibernate 检索方式 ,[object Object],动态查询: session.createCriteria(Customer.class) .add(Expression.like(“name”,name.toLowerCase()),MatchMode.ANYWHERE) .add(Expression.eq(“age”,new Integer(11))); 集合过滤: hql : createQuery(“from Order o where o.customer=:customer and o.price>100  order by o.price”).setEntity(“customer”,customer).list(); 使用集合过滤: session.createFilter(customer.getOrders(),”where this.price > 100 order by this.price”).list(); 子查询: from Customer c where 1 < (select count(o) from c.orders o); 本地 SQL 查询: String sql=“select cs.ID as {c.id},cs.NAME as {c.name},cs.AGE as {c.age} from CUSTOMERS cs where cs.ID = 1”; Query query = session.createSQLQuery(sql,”c”,Customer.class); 第二个参数是类的别名,在 SQL 语句中,每个字段的别名必须位于打括号内。
第十一章  hibernate 检索方式 ,[object Object],[object Object],query1=session.createQuery(“from Customer c”); List result1 = query1.list(); Query query2 = session.createQuery(“from Customer c where c.age < 30”); Iterator it = query2.iterator(); query 接口的 iterate 方法首先检索 ID 字段,然后根据 ID 字段到一级缓存、二级缓存中查 找,有则返回,否则查库。
第十一章  hibernate 检索方式 ,[object Object],[object Object],在 hibernate.properties 中的 hibernate.cache.use_query_cache=true query = session.createQuery(“from Cusotmer c where c.age>:age”); query.setInteger(“age”,new Integer(1)); query.setCacheable(true); ------ 如果想更加细粒度的控制查询缓存,可设置缓存区域 query.setCacheRegion(“customer”)
第十一章  hibernate 检索方式 ,[object Object],适合动态生成查询语句 支持动态查询,编程麻烦 对动态查询语句的支持 用户可扩展 criteria 接口 编译时被解析,更易排错 更加面向对象 不支持报表查询和子查询。有限的连接查询 将语句肢解成一组 criteria ,较差 QBC 检索 不具扩展性 运行时被解析 基于字符串形式的 sql 支持各种查询 优点:和 sql 相近,易读 HQL 检索 可读性 功能 查询语句形式 何时被解析 可扩展性 比较方面
数据库事务与并发 ,[object Object],当 hibernate 向库中 save 或 update 一个对象时,会自动使用这种锁模式。该模式仅供 hibernate 使用,在应用程序中不该使用它。 同 LockMode.UPGRADE. 对于 oracle ,执行 select ... for update no wait 语句, nowait 表明如果执行该语句的事务不能立即获得悲观锁,不会等待其他事务解锁,而是立即抛出一个异常。 不管缓存有无,都查库,同上,如果数据库系统支持悲观锁,执行 select ... for update 操作,否则执行普通的 sql 语句。 不管缓存中是否存在,都查库,如果映射文件中设置了版本元素,就执行版本检查,比较缓存中的对象和库中的版本是否一致。 如果缓存中存在该对象则返回,否则查库,默认值。 LockMode.NONE LockMode.READ LockMode.UPGRADE LockMode.UPGRADE_NOWAIT LockMode.WRITE session.get(Accout.class,new Long(1),LockMode.UPGRADE)
数据库事务与并发 ,[object Object],[object Object],如果数据库不支持 select ... for update 语句时,可由应用程序来实现悲观锁。这需要在 表中建个锁字段,可以是布尔值。 true 表示锁定态, false 表示空闲态。 步骤: 1 。根据 lock 字段判段记录的状态 2 。若锁定了,一直等待。直到空闲。 3 。如果空闲,改成锁定态。 4 。更新记录,改称空闲态,解除锁定。
数据库事务与并发 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],使用版本: create table a( ... VERSION intger ... ) 使用版本: <id name=“*” column=“”> <generator ..> </id> <version name=“version”  column=“VERSION”> 使用版本: class Account{ ... private int version; ... } 在影射文件中, <verion> 元素必须跟在 <id> 之后。
数据库事务与并发 ,[object Object],[object Object],[object Object],[object Object],使用版本: create table a( ... timestamp timestamp; ... ) 使用版本: <id name=“*” column=“”> <generator ..> </id> <timestamp name=“timestamp”  column=“TIMESTAMP”> 使用版本: class Account{ ... private Date timestamp; ... } 在影射文件中, <timestamp> 元素必须跟在 <id> 之后。
数据库事务与并发 ,[object Object],会计划执行一个 update 语句 update .. where id=1 and VERSION=0; 当清理缓存时才会执行这个 update 语句,并进行版本检查,如果库中没有匹配的记录,抛出 StaleObjectStateException 异常 不会计划执行一个 update 语句。 执行 update 方法时不会立即进行版本检查,只有当 session 在清理缓存时,真正执行 update 语句时才进行版本检查。 udate() 都能使一个游离对象与当前会话关联 如果设定了 LockMode.READ 模式,则立即进行版本检查,执行类似以下形式的 select 语句: select ID from ACCOUNTS where ID=1 and VERSION=0; 如果数据库中没有匹配的记录,就抛出 StaleObjectStateException. lock() 相似之处 不同之处 比较两个方法
影射继承关系 ,[object Object],companys 表 -------------- ID NAME HE 表 -------------- ID<pk> Custome_ID<fk> NAME SE 表 -------------- ID<pk> company_id<fk> NAME
影射继承关系 company 类 SE 类 HE 类 Employee 类 company.hbm.xml SE.hbm.xml HE.hbm.xml company 表 SE 表 HE 表
影射继承关系 ,[object Object],<class name=“HE”...> ... <propery name=“rate” type=“string” column=“RATE”> ... </class> <class name=“SE”...> ... <propery name=“salary” type=“string” column=“RATE”> ... </class>
影射继承关系 ,[object Object],company 类 SE 类 HE 类 Employee 类 company.hbm.xml Employee.hbm.xml company 表 Employee 表
影射继承关系 <class name=“employee” table=“employee”> <id ...></id> <discriminator column=“EMPLOYEE_TYPE” type=“string”/> ... <subclass name=“HE” discriminator-value=“HE”> <propery name=“rate” column=“RATE” type=“double”/> </subclass> <subclass name=“SE” discriminator-value=“SE”> <propery name=“salary” column=“SALARY” type=“double”/> </subclass> </class>
映射继承关系 ,[object Object],<class name=“employee” table=“employee”> <id ...> </id> ... <joined-subclass name=“HE” table=“HE”> <key column=“employee_id”/> <property name=“salary” column=“salary” type=“string”> </joined-subclass> <joined-subclass name=“SE” table=“SE”> <key column=“employee_id”/> <property name=“rate” column=“rate” type=“string”> </joined-subclass> </class>
映射继承关系 ,[object Object],ClassD ClassB ClassC ClassA
映射继承关系 ,[object Object],表 D ----------- ID(PK) A_TYPE A_ID D1 表 B --------- A1 B1 表 C --------- A1 B1
映射继承关系 ,[object Object],<any name=“a” meta-type=“string” id-type=“long” cascade=“save-update”> <meta-value value=“B” class=“ClassB” /> <meta-value value=“C” class=“ClassC” /> <column name=“A_TYPE” /> <column name=“A_ID” /> </any>
第十六章 映射值类型集合 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第十六章 映射值类型集合 ,[object Object],<set name=“images” table=“IMAGES” lazy=“true”> <key column=“CUSTOMER_ID”> <element column=“FILENAME” type=“string” not-null> </set> name: 指定 customer 类的 images 属性名 table: 指定和 images 属性对应的表为 images 。 lazy: 如果为 true ,表示延迟检索。 Customer 中有一个集合类型的属性 images ,用来存放所有的图片名,则在 Customer 中的定义如下: Set images = new HashSet(); Customers 表 ID<<pk>> ... images 表 Customer_id(fk) FileName(pk)
第十六章 映射值类型集合 ,[object Object],<idbag name=“images” table=“IMAGES” lazy=“true”> <colllection-id type=“long” column=“ID”> <generator class=“increment”/> </collection-id> <key column=“CUSTOMER_ID” /> <element column=“FILENAME” type=“string” not-null=“true”> </idbag> bag 集合中的对象不按特定方式排序,但允许有重复对象。 java 集合的 API 中没有提供 bag 接口, hibernate 允许在持久化类中用 list 来模拟 bag 行为。如果 images 集合中允 许存放重复的文件名。可定义为: List images = new ArrayList(); ... Customers 表 ID<<PK>> ... images 表 ID<<PK>> Customer_id<<FK>> FileName(pk)
第十六章 映射值类型集合 ,[object Object],<list name=“images” table=“IMAGES” lazy=“true”> <key column=“CUSTOMER_ID” /> <index column=“position”/> <element column=“FILENAME” type=“string” not-null=“true”> </list> Customers 表 ID<<PK>> ... images 表 Customer_id<<FK>><<PK>> position<<PK>> FileName 如果希望 images 集合中的元素允许存放重复的元素,并且按照索引位置排序,首先应 在 images 表中定位一个 position 字段,代表每个元素在集合中的索引位置。
第十六章 映射值类型集合 ,[object Object],<map name=“images” table=“IMAGES” lazy=“true”> <key column=“CUSTOMER_ID” /> <index column=“image_name” type=“string”/> <element column=“FILENAME” type=“string” not-null=“true”> </list> 如果 images 集合中的每一个元素包含一对 key/value 对,那么应该把 images 集合定义 成 map 类型。 Map images = new HashMap(); Customers 表 ID<<PK>> ... images 表 Customer_id<<FK>><<PK>> image_name<<PK>> FileName
第十六章 映射值类型集合 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],支持 支持 <map> 不支持 不支持 <list> 支持 不支持 <idbag> 支持 支持 <set> sort order-by 排序属性
第十六章 映射值类型集合 ,[object Object],[object Object],<set> <idbag> <map> 元素都有 order-by 属性,若设置了该属性,当 hibernate 通 过 select 语句检索对象时,利用 order by 子句进行排序。 <set name=“images” table=“IMAGES” lazy=“true”  order-by=“FILENAME asc” > <key column=“CUSOTMER_ID” /> <element column=“FILENAME” type=“string” not-null=“true” /> </set> 在 order-by 属性中还可加入 sql 函数,例如: <set name=“images” table=“IMAGES”  order-by=“lower(FILENAME) asc” > ... </set>
第十六章 映射值类型集合 ,[object Object],[object Object],对键对象排序: <map name=“images” table=“IMAGES” lazy=“true”  order-by=“IMAGE_NAME” > ...... </ map > 对值对象排序: <map name=“images” table=“IMAGES” lazy=“true”  order-by=“FILENAME” > ...... </ map > 按 ID 代理主键排序: <idbag name=“images” table=“IMAGES�
Hibernate教程
Hibernate教程
Hibernate教程
Hibernate教程
Hibernate教程
Hibernate教程
Hibernate教程
Hibernate教程

Mais conteúdo relacionado

Mais procurados

An introduce to n hibernate (part 1) pub
An introduce to n hibernate (part 1) pubAn introduce to n hibernate (part 1) pub
An introduce to n hibernate (part 1) pub
jiangxu
 
第五章:Struts2标签库
第五章:Struts2标签库第五章:Struts2标签库
第五章:Struts2标签库
shmily7788
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
appollo0312
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
Guo Albert
 
Java相关基础知识
Java相关基础知识Java相关基础知识
Java相关基础知识
yiditushe
 
中心教员J2 Ee面试题
中心教员J2 Ee面试题中心教员J2 Ee面试题
中心教员J2 Ee面试题
yiditushe
 

Mais procurados (15)

An introduce to n hibernate (part 1) pub
An introduce to n hibernate (part 1) pubAn introduce to n hibernate (part 1) pub
An introduce to n hibernate (part 1) pub
 
Ajax Lucence
Ajax LucenceAjax Lucence
Ajax Lucence
 
第五章:Struts2标签库
第五章:Struts2标签库第五章:Struts2标签库
第五章:Struts2标签库
 
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 SpringSpring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
 
Les3
Les3Les3
Les3
 
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit TestingASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
 
SCJP ch17
SCJP ch17SCJP ch17
SCJP ch17
 
Java相关基础知识
Java相关基础知识Java相关基础知识
Java相关基础知识
 
中心教员J2 Ee面试题
中心教员J2 Ee面试题中心教员J2 Ee面试题
中心教员J2 Ee面试题
 
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答
 
SCJP ch09
SCJP ch09SCJP ch09
SCJP ch09
 
领域驱动设计实践
领域驱动设计实践领域驱动设计实践
领域驱动设计实践
 
Java SE 7 技術手冊第六章草稿 - 何謂繼承?
Java SE 7 技術手冊第六章草稿 - 何謂繼承?Java SE 7 技術手冊第六章草稿 - 何謂繼承?
Java SE 7 技術手冊第六章草稿 - 何謂繼承?
 

Destaque

Effective Spring Transaction Management
Effective Spring Transaction ManagementEffective Spring Transaction Management
Effective Spring Transaction Management
UMA MAHESWARI
 
Spring Transaction
Spring TransactionSpring Transaction
Spring Transaction
patinijava
 
ORM, JPA, & Hibernate Overview
ORM, JPA, & Hibernate OverviewORM, JPA, & Hibernate Overview
ORM, JPA, & Hibernate Overview
Brett Meyer
 
Java Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By StepJava Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By Step
Guo Albert
 

Destaque (16)

Thinking Beyond ORM in JPA
Thinking Beyond ORM in JPAThinking Beyond ORM in JPA
Thinking Beyond ORM in JPA
 
Spring Transaction Management
Spring Transaction ManagementSpring Transaction Management
Spring Transaction Management
 
Effective Spring Transaction Management
Effective Spring Transaction ManagementEffective Spring Transaction Management
Effective Spring Transaction Management
 
Spring transaction part4
Spring transaction   part4Spring transaction   part4
Spring transaction part4
 
Spring Transaction
Spring TransactionSpring Transaction
Spring Transaction
 
Spring Framework - Data Access
Spring Framework - Data AccessSpring Framework - Data Access
Spring Framework - Data Access
 
Spring Data JPA - Repositories done right
Spring Data JPA - Repositories done rightSpring Data JPA - Repositories done right
Spring Data JPA - Repositories done right
 
Spring Data JPA
Spring Data JPASpring Data JPA
Spring Data JPA
 
Hibernate ORM: Tips, Tricks, and Performance Techniques
Hibernate ORM: Tips, Tricks, and Performance TechniquesHibernate ORM: Tips, Tricks, and Performance Techniques
Hibernate ORM: Tips, Tricks, and Performance Techniques
 
Introduction to JPA and Hibernate including examples
Introduction to JPA and Hibernate including examplesIntroduction to JPA and Hibernate including examples
Introduction to JPA and Hibernate including examples
 
JPA and Hibernate
JPA and HibernateJPA and Hibernate
JPA and Hibernate
 
ORM, JPA, & Hibernate Overview
ORM, JPA, & Hibernate OverviewORM, JPA, & Hibernate Overview
ORM, JPA, & Hibernate Overview
 
Overview of JPA (Java Persistence API) v2.0
Overview of JPA (Java Persistence API) v2.0Overview of JPA (Java Persistence API) v2.0
Overview of JPA (Java Persistence API) v2.0
 
JPA Best Practices
JPA Best PracticesJPA Best Practices
JPA Best Practices
 
Intro To Hibernate
Intro To HibernateIntro To Hibernate
Intro To Hibernate
 
Java Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By StepJava Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By Step
 

Semelhante a Hibernate教程

中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
yiditushe
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
yiditushe
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
lydiafly
 
網站設計100步
網站設計100步網站設計100步
網站設計100步
evercislide
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
ArBing Xie
 

Semelhante a Hibernate教程 (20)

中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
NHibernate分享(1) share
NHibernate分享(1) shareNHibernate分享(1) share
NHibernate分享(1) share
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
 
Js培训
Js培训Js培训
Js培训
 
Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 16 章 - 整合資料庫Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 16 章 - 整合資料庫
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术
 
Mybatis学习培训
Mybatis学习培训Mybatis学习培训
Mybatis学习培训
 
Flex 4.5 action custom component development
Flex 4.5 action custom component developmentFlex 4.5 action custom component development
Flex 4.5 action custom component development
 
網站設計100步
網站設計100步網站設計100步
網站設計100步
 
Sql Alchemy Story
Sql Alchemy StorySql Alchemy Story
Sql Alchemy Story
 
运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践
 
Structs2簡介
Structs2簡介 Structs2簡介
Structs2簡介
 
Real World ASP.NET MVC
Real World ASP.NET MVCReal World ASP.NET MVC
Real World ASP.NET MVC
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
 
Banquet 15
Banquet 15Banquet 15
Banquet 15
 
Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解
 
山頂洞人日記 - 回歸到最純樸的開發
山頂洞人日記 -  回歸到最純樸的開發山頂洞人日記 -  回歸到最純樸的開發
山頂洞人日記 - 回歸到最純樸的開發
 
Exodus2 大局观
Exodus2 大局观Exodus2 大局观
Exodus2 大局观
 
Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese Version
 

Mais de Shilong Sang (16)

C:\Documents And Settings\User\桌面\Installation Guide O Oo3
C:\Documents And Settings\User\桌面\Installation Guide O Oo3C:\Documents And Settings\User\桌面\Installation Guide O Oo3
C:\Documents And Settings\User\桌面\Installation Guide O Oo3
 
7月~12月份影片概况 0703更新
7月~12月份影片概况 0703更新7月~12月份影片概况 0703更新
7月~12月份影片概况 0703更新
 
Sexix
SexixSexix
Sexix
 
groovy经典入门
groovy经典入门groovy经典入门
groovy经典入门
 
针对 Java程序员的 U M L概述
针对 Java程序员的 U M L概述针对 Java程序员的 U M L概述
针对 Java程序员的 U M L概述
 
《狭义与广义相对论浅说》
《狭义与广义相对论浅说》《狭义与广义相对论浅说》
《狭义与广义相对论浅说》
 
人月神话
人月神话人月神话
人月神话
 
自己动手写操作系统
自己动手写操作系统自己动手写操作系统
自己动手写操作系统
 
《最后期限》
《最后期限》《最后期限》
《最后期限》
 
webwork2guide
webwork2guidewebwork2guide
webwork2guide
 
Spring基础教程
Spring基础教程Spring基础教程
Spring基础教程
 
spring_jiaocheng
spring_jiaochengspring_jiaocheng
spring_jiaocheng
 
oracle
oracleoracle
oracle
 
Spring课件
Spring课件Spring课件
Spring课件
 
Spring课件
Spring课件Spring课件
Spring课件
 
groovy
groovygroovy
groovy
 

Hibernate教程

  • 1. 精通 Hibernate java 对象持久化技术祥解 Hibernate 入门 OR 映射技术 通过 Hibernate API 操纵数据库 检索策略和方式 数据库事务、并发、缓存与性能优化 高级配置。
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62. 第五章 映射对象标识符 适用于自然主键。由 java 程序负责生成标识符。不能把 setID() 方法声明为 Private 的。尽量避免使用自然主键。 适用于代理主键。 Hibernate 采用 128 位的 UUID 算法来生成标识符。该算法 能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。 适用于代理主键。根据底层数据库对自动生成表示符的能力来选择 identity 、 sequence 、 hilo 适用于代理主键。 Hibernate 根据 hign/low 算法生成标识符。 Hibernate 把特定表的字段作为“ hign” 值。默认情况下,采用 hibernate_unique_key 表的 next_hi 字段。 适用于代理主键。 Hibernate 根据底层数据库序列生成标识符。条件是数据库支持序列。 适用于代理主键。由底层数据库生成表识符。条件是数据库支持自动增长数据类型。 适用于代理主键。由 hibernate 自动以递增的方式生成表识符,每次增量为 1 描述 Increment Identity Sequence Hilo Uuid.hex Native assigned 表示符生成器
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70. 第六章 映射一对多关联关系 Order 到 Customer 的多对一单向关联 Customer 到 Order 的一对多单向关联 Customer 到 Order 的一对多双向关联
  • 71.
  • 72.
  • 73. 第六章 映射一对多关联关系 tx = session.beginTransaction(); Customer c = new Customer(); c.setName(&quot;TOM&quot;); session.save(c); ? 会有什么后果 Order o1 = new Order(); o1.setOrderNumber(&quot;1&quot;); o1.setCustomer(c); Order o2 = new Order(); o2.setOrderNumber(&quot;1&quot;); o2.setCustomer(c); session.save(o1); session.save(o2); tx.commit();
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94. 第七章 操纵持久化对象 结束生命周期 结束生命周期 c2 = null; 处于游离态 转变为游离态 处于持久化状态 转变为持久化状态 临时状态 状态 处于生命周期中 处于生命周期中 处于生命周期中 处于生命周期中 开始生命周期 生命周期 tx = session.beginTransaction(); Customer c = new Customer(“Tom”,new HashSet); Session.save(c) Long id=c.getId(); c = null; Customer c2 = (Customer)session.load(Customer.class,id); tx.commit(); session.close(); c2,getName(); 程序代码
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108. public class AuditLogInterceptor implements Interceptor, Serializable { private Session session; private Set inserts=new HashSet(); private Set updates=new HashSet(); public void setSession(Session session){ this.session=session; } public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types){ if ( entity instanceof Auditable ) { updates.add(entity); } return false; } public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { return false; } public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { if ( entity instanceof Auditable ) { inserts.add(entity); } return false; } public void postFlush(Iterator entities) { try{ Iterator it=updates.iterator(); while(it.hasNext()){ Auditable entity=(Auditable)it.next(); AuditLog.logEvent(&quot;update&quot;,entity,session); } it=inserts.iterator(); while(it.hasNext()){ Auditable entity=(Auditable)it.next(); AuditLog.logEvent(&quot;insert&quot;,entity,session); } }catch(Exception e){e.printStackTrace();} finally{ inserts.clear(); updates.clear(); } } }
  • 111. 第八章 映射组成关系 Class customer{ …… Address homeAddress ; Address comAddress ; …… } Table customers{ …… home_province home_city home_street com_province com_city com_street …… } <compont name=“homeaddress” class=“mypack.Address”> <parent name=“customer” /> <property name=“street” type=“string” column=“HOME_STREET” /> <property name=“city” type = “string” cloumn=“HOME_CITY” /> <property name=“street” type = “string” cloumn=“HOME_STREET” /> </component> <compont name=“comaddress” class=“mypack.Address”> <parent name=“customer” /> <property name=“street” type=“string” column=“COM_STREET” /> <property name=“city” type = “string” cloumn=“COM_CITY” /> <property name=“street” type = “string” cloumn=“COM_STREET” /> </component>
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128. <property name=&quot;name&quot; type=&quot;mypack.NameCompositeUserType&quot; > <column name=&quot;FIRSTNAME&quot; length=&quot;15&quot; /> <column name=&quot;LASTNAME&quot; length=&quot;15&quot; /> </property> <property name=&quot;homeAddress&quot; type=&quot;mypack.AddressUserType&quot; > <column name=&quot;HOME_STREET&quot; length=&quot;15&quot; /> <column name=&quot;HOME_CITY&quot; length=&quot;15&quot; /> <column name=&quot;HOME_PROVINCE&quot; length=&quot;15&quot; /> <column name=&quot;HOME_ZIPCODE&quot; length=&quot;6&quot; /> </property> <property name=&quot;comAddress&quot; type=&quot;mypack.AddressUserType&quot; > <column name=&quot;COM_STREET&quot; length=&quot;15&quot; /> <column name=&quot;COM_CITY&quot; length=&quot;15&quot; /> <column name=&quot;COM_PROVINCE&quot; length=&quot;15&quot; /> <column name=&quot;COM_ZIPCODE&quot; length=&quot;6&quot; /> </property>
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170. 影射继承关系 company 类 SE 类 HE 类 Employee 类 company.hbm.xml SE.hbm.xml HE.hbm.xml company 表 SE 表 HE 表
  • 171.
  • 172.
  • 173. 影射继承关系 <class name=“employee” table=“employee”> <id ...></id> <discriminator column=“EMPLOYEE_TYPE” type=“string”/> ... <subclass name=“HE” discriminator-value=“HE”> <propery name=“rate” column=“RATE” type=“double”/> </subclass> <subclass name=“SE” discriminator-value=“SE”> <propery name=“salary” column=“SALARY” type=“double”/> </subclass> </class>
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.