`
阅读更多
一.hibernate常用接口

1.configuration(org.hibernate.cfg.Configuration)

配置hibernate,启动hibernate,创建SessionFactory对象

2.SessionFactory(org.hibernate.SessionFactory)

初始化hibernate,创建session对象,通常使用单例模式创建此对象

3.Session(org.hibnernate.Session)

Session 不是线程安全的,负责保存、修该、删除、查询和加载对象

ThreadLocal可以解决线程的并发问题

4.Transaction 事务(org.hibernate.Transaction)

事务管理,开启事务session.beginTransaction(),提交tr.commit()

5.Query和Criteria接口

Query实例封装一个HQL或者SQL查询语句。HQL是Hibernate自定义的查询语句,

它的语法和SQL类似,但是面向持久化对象类和属性的面向对象查询语句,而不是表的表名和字段名。

Criteria实例则是以函数API的方式动态的设置查询条件,组成查询语句,完全是基于字符串形成的。

二.hibernate工作原理



JNDI:Java Naming and Directory Interface ,Java命名目录接口
术语解释:一组帮助做多个命名和目录服务接口的API。
    JNDI(Java Naming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问

各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。通过一个字符串与业务逻辑功

能连接起来,实现的分布式下的应用开发。

JTA:Java Transaction API,Java事务API

       Java事务API(JTA;Java Transaction API)和它的同胞Java事务服务(JTS;Java Transaction Service),

为J2EE平台提供了分布式事务服务。一个分布式事务(distributed transaction)包括一个事务管理器

(transaction manager)和一个或多个资源管理器(resource manager)。一个资源管理器(resource

manager)是任意类型的持久化数据存储。事务管理器(transaction manager)承担着所有事务参与单元者

的相互通讯的责任。

     JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的

数据库连接。应用程序调用begin()来起动事务,即可调用commit()也可以调用rollback()来结束事务。

三.Java和关系数据库的对象识别方法

31.  Java是按内存地址区分对象,但可以重写Equals()和hashcode()方法,使用值来区分对象。

32.  关系型数据库使用主键区分记录。

33.  hibernate使用主键来区分对象。

四.hibernate主键的实现方法

(就第一节的实例进行解析)

4.1  映射代理主键

属性id的类型有数据库表的basicCar的主键类型和hibernate的映射类型决定。定义id信息的映射文件段如下:
<class name="basicCar.bean.BasicCar" table="basicCar">
  <id name="id" column="id" type="long">
  <generator class="increment"></generator>
  </id>

.....
</class>

4.2  映射单个自然主键

有时当确定某一对象属性是不变的,唯一能用来区分不同对象尸体的,也可以采用这个属性对应的字段作为

数据库表的主键。例如,假设person人和人的名字肯定是不会重复的,不会改变的,那么可以使用名字name来

作为主键,即为单个自然主键的例子,(不提倡使用自然主键)。

<class name="Person" table="person">
  <id name="name" column="name" type="String">
   <generator class="assigned"></generator>
  </id>

......
</class>

4.3  映射复合自然主键

4.3.1  不单独定义主键类

例:对name和date两个属性,重写Equasl()和hashcode()方法。

@Override
public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + ((date == null) ? 0 : date.hashCode());
  result = prime * result + ((name == null) ? 0 : name.hashCode());
  return result;
}
@Override
public boolean equals(Object obj) {
  if (this == obj)
   return true;
  if (obj == null)
   return false;
  if (getClass() != obj.getClass())
   return false;
  final BasicCar other = (BasicCar) obj;
  if (date == null) {
   if (other.date != null)
    return false;
  } else if (!date.equals(other.date))
   return false;
  if (name == null) {
   if (other.name != null)
    return false;
  } else if (!name.equals(other.name))
   return false;
  return true;
}

BasicCar.hbm.xml映射文件

<class name="basicCar.bean.BasicCar" table="basicCar">
  <composite-id>
   <key-property name="name" type="string"></key-property>
   <key-property name="date" type="date"></key-property>
  </composite-id>

....
</class>

4.3.2    单独定义主键类

例:同样,name和date两个属性,重写Equasl()和hashcode()方法。但是在不同类中,需要定义一个

单独的basiccar作为主键类。代码如下:

package basicCar;

import java.io.Serializable;
import java.util.Date;

public class basiccar implements Serializable{
private String name;
private Date date;
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}
public Date getDate() {
  return date;
}
public void setDate(Date date) {
  this.date = date;
}
@Override
public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + ((date == null) ? 0 : date.hashCode());
  result = prime * result + ((name == null) ? 0 : name.hashCode());
  return result;
}
@Override
public boolean equals(Object obj) {
  if (this == obj)
   return true;
  if (obj == null)
   return false;
  if (getClass() != obj.getClass())
   return false;
  final basicCar1 other = (basicCar1) obj;
  if (date == null) {
   if (other.date != null)
    return false;
  } else if (!date.equals(other.date))
   return false;
  if (name == null) {
   if (other.name != null)
    return false;
  } else if (!name.equals(other.name))
   return false;
  return true;
}
}
这样BasicCar中就需要拥有basiccar作为属性,来代替原来的name和date代码如下:

package basicCar;
import java.io.Serializable;
public class BasicCar implements Serializable{
private long id;
private String factory;
private basiccar basiccar1;
public long getId() {
  return id;
}
public void setId(long id) {
  this.id = id;
}
public String getFactory() {
  return factory;
}
public void setFactory(String factory) {
  this.factory = factory;
}
public basicCar1 getBasiccar1() {
  return basiccar1;
}
public void setBasiccar1(basicCar1 basiccar1) {
  this.basiccar1 = basiccar1;
}
}

BasicCar.hbm.xml映射文件

在映射文件中需要定义用来作为主键的basiccar。代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
          <class name="basicCar.BasicCar" table="basicCar">
                <composite-id name="basiccar1" class="basicCar.basicCar1">
                        <key-property name="name" type="string"></key-property>
                        <key-property name="date" type="date"></key-property>
               </composite-id>
               <property name="id" type="long"></property>
               <property name="factory" type="string"></property>
         </class>
</hibernate-mapping>

  • 大小: 94.5 KB
分享到:
评论

相关推荐

    hibernate 教程

    第二层缓存(The Second Level Cache)s 14.3.1. 对映射(Mapping)缓冲 14.3.2. 策略:只读缓存 14.3.3. 策略:读/写缓存 14.3.4. 策略:不严格的读/写缓存 14.3.5. 策略:事务缓存(transactional) ...

    Hibernate教程

    1. 第二级缓存:通过配置,可以启用缓存,提高读取性能。 2. 分页查询:使用Query的setFirstResult()和setMaxResults()方法实现分页,减少数据库负载。 3.延迟加载(Lazy Loading):只在真正需要时加载关联对象,...

    hibernate教程

    1. 第二级缓存:缓存结果集,提高查询效率。 2. 查询计划:使用批处理和预编译SQL提升性能。 3. 异步操作:利用Future和Thread Pool进行异步数据库访问。 十一、事务管理 Hibernate支持编程式和声明式事务管理,...

    Hibernate视频教程免费下载

    - 二级缓存:需显式配置,可选用多种第三方缓存实现。 - **事务管理**: - 声明式事务:通过配置文件或注解来管理事务。 - 编程式事务:通过编程的方式手动控制事务的开始、提交或回滚。 #### 五、案例分析 - **...

    MyEclipse Hibernate 快速入门中文教程

    Hibernate提供了第一级缓存(Session缓存)和第二级缓存(可选)。第一级缓存默认开启,存储单个Session内的对象。第二级缓存可以跨Session共享数据,提高性能,但需谨慎使用,防止数据一致性问题。 通过这个快速...

    私塾在线Hibernate4教程(上下部共241页)

    进一步,Hibernate4在缓存机制上有了很大的改进,教程将介绍一级缓存和二级缓存的使用,以及第三方缓存如 EhCache 和 Infinispan 的集成。这将帮助提高应用的性能,减少对数据库的直接访问。 最后,高级主题如...

    Hibernate教程03_Hibernate核心开发接口介绍

    在本教程中,我们将深入探讨Hibernate的核心开发接口,这些接口是Hibernate框架的基石,使得开发者能够轻松地与数据库进行交互。Hibernate是一个强大的Java对象关系映射(ORM)框架,它消除了传统SQL编程的繁琐,...

    hibernate中文版教程

    二级缓存则可以跨Session共享,常与第三方缓存服务如Ehcache集成,以实现更高效的缓存策略。 八、懒加载和级联操作 懒加载是一种优化策略,只有在真正需要时才会加载关联的对象,避免了不必要的数据库访问。级联...

    Hibernate最新中文教程

    ### Hibernate 最新中文教程知识点概览 #### 一、Hibernate简介与应用场景 - **定义**:Hibernate 是一款开源的对象关系映射(Object Relational Mapping,ORM)框架,它为 Java 应用提供了一种将应用的数据对象...

    Hibernate教程25_Hibernate缓存

    **标题解析:** "Hibernate教程25_Hibernate缓存" 这个标题表明了我们要讨论的是关于Hibernate框架的第25个教程,重点是它的缓存机制。Hibernate是一个流行的Java对象关系映射(ORM)框架,它允许开发者用面向对象的...

    hibernate学习资料大全

    Hibernate 提供了第一级缓存和第二级缓存,以及查询缓存,能够提高数据访问速度。学习如何配置和使用缓存,可以有效提升应用性能。 9. **延迟加载和懒加载**: 延迟加载(Lazy Loading)是Hibernate的一项重要...

    01_传智播客hibernate教程_hibernate介绍与动手入门体验

    9. 第一次Hello World程序:通过一个简单的例子,展示如何使用Hibernate进行首次数据库操作。 10. 引入关联和级联操作:讨论如何处理实体之间的关联,如一对一、一对多、多对一和多对多,以及级联操作的使用。 11. ...

    Hibernate 教程

    3. **`最经典的hibernate教程_从入门到精通_第一篇(共四篇).ppt`**:系列教程,逐步讲解Hibernate从基础到进阶的应用,帮助读者从零开始掌握Hibernate。 在学习过程中,建议结合实际项目练习,理论与实践相结合,以...

    02_传智播客hibernate教程_hibernate入门案例的细节分析

    11. **缓存机制**:理解Hibernate的第一级缓存(Session级别)和第二级缓存(SessionFactory级别),以及如何配置和使用第三方缓存。 12. **性能优化**:如批处理、延迟加载、懒加载、缓存策略等提高Hibernate应用...

    hibernate插件

    `hibernate.cfg.xml`是Hibernate的主要配置文件,包含了数据库连接信息、缓存设置、日志配置等,是启动Hibernate的第一步。 **5. 映射文件(User.hbm.xml)** 这是用户实体类到数据库表的映射文件,定义了对象属性...

    hibernate4教程

    Hibernate4是Hibernate框架的第四个主要版本,它在兼容性、性能和API设计上都有所提升。这个版本支持JPA 2.1规范,使得开发者可以同时利用Hibernate的高级特性与Java企业版的标准接口。 二、环境配置 配置Hibernate...

    hibernate2.1

    9. **第二级缓存(Second-Level Cache)**:为了提高性能,Hibernate 2.1支持第二级缓存,它可以存储已经加载过的对象,减少对数据库的访问。 10. **Callback事件**:Hibernate 2.1提供了预加载、加载、保存、更新...

Global site tag (gtag.js) - Google Analytics