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 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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值