首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate第二回教程

2012-10-09 
Hibernate第二次教程一.hibernate常用接口1.configuration(org.hibernate.cfg.Configuration)配置hibernat

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>

热点排行