Hibernate第二次教程
一.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 table="person">
<id name="name" column="name" type="String">
<generator 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" 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>