一.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
分享到:
相关推荐
第二层缓存(The Second Level Cache)s 14.3.1. 对映射(Mapping)缓冲 14.3.2. 策略:只读缓存 14.3.3. 策略:读/写缓存 14.3.4. 策略:不严格的读/写缓存 14.3.5. 策略:事务缓存(transactional) ...
1. 第二级缓存:通过配置,可以启用缓存,提高读取性能。 2. 分页查询:使用Query的setFirstResult()和setMaxResults()方法实现分页,减少数据库负载。 3.延迟加载(Lazy Loading):只在真正需要时加载关联对象,...
1. 第二级缓存:缓存结果集,提高查询效率。 2. 查询计划:使用批处理和预编译SQL提升性能。 3. 异步操作:利用Future和Thread Pool进行异步数据库访问。 十一、事务管理 Hibernate支持编程式和声明式事务管理,...
- 二级缓存:需显式配置,可选用多种第三方缓存实现。 - **事务管理**: - 声明式事务:通过配置文件或注解来管理事务。 - 编程式事务:通过编程的方式手动控制事务的开始、提交或回滚。 #### 五、案例分析 - **...
Hibernate提供了第一级缓存(Session缓存)和第二级缓存(可选)。第一级缓存默认开启,存储单个Session内的对象。第二级缓存可以跨Session共享数据,提高性能,但需谨慎使用,防止数据一致性问题。 通过这个快速...
进一步,Hibernate4在缓存机制上有了很大的改进,教程将介绍一级缓存和二级缓存的使用,以及第三方缓存如 EhCache 和 Infinispan 的集成。这将帮助提高应用的性能,减少对数据库的直接访问。 最后,高级主题如...
在本教程中,我们将深入探讨Hibernate的核心开发接口,这些接口是Hibernate框架的基石,使得开发者能够轻松地与数据库进行交互。Hibernate是一个强大的Java对象关系映射(ORM)框架,它消除了传统SQL编程的繁琐,...
二级缓存则可以跨Session共享,常与第三方缓存服务如Ehcache集成,以实现更高效的缓存策略。 八、懒加载和级联操作 懒加载是一种优化策略,只有在真正需要时才会加载关联的对象,避免了不必要的数据库访问。级联...
### Hibernate 最新中文教程知识点概览 #### 一、Hibernate简介与应用场景 - **定义**:Hibernate 是一款开源的对象关系映射(Object Relational Mapping,ORM)框架,它为 Java 应用提供了一种将应用的数据对象...
**标题解析:** "Hibernate教程25_Hibernate缓存" 这个标题表明了我们要讨论的是关于Hibernate框架的第25个教程,重点是它的缓存机制。Hibernate是一个流行的Java对象关系映射(ORM)框架,它允许开发者用面向对象的...
Hibernate 提供了第一级缓存和第二级缓存,以及查询缓存,能够提高数据访问速度。学习如何配置和使用缓存,可以有效提升应用性能。 9. **延迟加载和懒加载**: 延迟加载(Lazy Loading)是Hibernate的一项重要...
9. 第一次Hello World程序:通过一个简单的例子,展示如何使用Hibernate进行首次数据库操作。 10. 引入关联和级联操作:讨论如何处理实体之间的关联,如一对一、一对多、多对一和多对多,以及级联操作的使用。 11. ...
3. **`最经典的hibernate教程_从入门到精通_第一篇(共四篇).ppt`**:系列教程,逐步讲解Hibernate从基础到进阶的应用,帮助读者从零开始掌握Hibernate。 在学习过程中,建议结合实际项目练习,理论与实践相结合,以...
11. **缓存机制**:理解Hibernate的第一级缓存(Session级别)和第二级缓存(SessionFactory级别),以及如何配置和使用第三方缓存。 12. **性能优化**:如批处理、延迟加载、懒加载、缓存策略等提高Hibernate应用...
`hibernate.cfg.xml`是Hibernate的主要配置文件,包含了数据库连接信息、缓存设置、日志配置等,是启动Hibernate的第一步。 **5. 映射文件(User.hbm.xml)** 这是用户实体类到数据库表的映射文件,定义了对象属性...
Hibernate4是Hibernate框架的第四个主要版本,它在兼容性、性能和API设计上都有所提升。这个版本支持JPA 2.1规范,使得开发者可以同时利用Hibernate的高级特性与Java企业版的标准接口。 二、环境配置 配置Hibernate...
9. **第二级缓存(Second-Level Cache)**:为了提高性能,Hibernate 2.1支持第二级缓存,它可以存储已经加载过的对象,减少对数据库的访问。 10. **Callback事件**:Hibernate 2.1提供了预加载、加载、保存、更新...