- 浏览: 103054 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
Hibernate映射类型分为两种:内置映射类型和客户化映射类型,内置映射类型负责把常见的java类型映射到相应的sql类型;另外,用户可以实现UserType或CompositeUserType接口,来定制客户化映射类型,这样可以把用户定义 的java类型映射到数据库表的相应字段。
1、内置映射类型
1.1 java基本类型的hibernate映射类型
1.2 java时间和日期类型的hibernate映射类型
1.3 Java大对象类型的hibernate映射类型
注意:不允许使用这些数据类型来定义持久化类的OID。
CLOB:字符串大对象(Character Large Object)
BLOB:表示二进制大对象(Binary Large Object)
MySql中不支持标准SQL的CLOB类型,MySQL中使用TEXT,MEDIUMTEXT,LONGTEXT类型类表示长度超过255的长文本数据,分别为0~65535,0~16777215,0~4294967295字节。
如果持久化类的某个字段为java.sql.Clob或java.sql.Blob实例时,映射设置如下:
<property name="description" type="clob" column="DESCRIPTION">
在应用程序中通过Hibernate来保存java.sql.Clob或java.sql.Blob实例时,必须包括以下两个步骤:
a. 在数据库事务中先保存一个空的Blob或Clob实例。
b. 接着锁定这条记录,更新在a中保存的实例,把二进制数据或长文本数据写到Blob或Clob实例中。
例:
Session session = sessionFactory.openSession();
Transaction tx = session.begainTransaction();
customer = new Customer();
//现保存空的clob实例
customer.setDescription(Hibernate.createClob(" "));
session.save(customer);
session.flush();
//锁定这条记录
session.refresh(customer,LockMode.UPGRADE);
oracle.sql.Clob clob = (Oracle.sql.Clob)customer.getDescription();
//把长文本数据写到Clob实例中
java.io.Writer.pw=clob.getCharacterOutputStream();
pw.write(longText);//longText表示一个长度〉255的字符串
pw.close();
tx.commit();
session.close();
尽管java.sql.Clob和java.sql.Blob是处理java大对象的有效方式,但是使用二者受到以下两点限制:
a. 如果在持久化类中定义了一个该类型的属性,只有在一个数据库事务中,这样的实例才会有效。
b. 有些数据库系统的jdbc驱动程序不支持这样的类型。
如果在java程序中处理图片或长文件的二进制数据,使用byte[]比Blob更方便,处理长度>255的字符串使用String比Clob更方便。
1.4 JDK自带的个别java类的hibernate映射类型
1.5 使用映射类型
在以下情况下必须显示指定映射文件中的hibernate映射类型:
a. 如果希望通过hbm2java工具由映射文件来生成持久化类,必须在映射文件中显式指定映射类型
b. 一个java类型对应多个Hibernate映射类型的场合。如:java.util.Date,可以对应Hibernate的映射类型中的date,time,timestamp。
2、客户化映射类型
2.1 用户化映射类型取代Hibernate组件
曾经用组件来映射Customer类的Address类型的homeAddress属性和comAddress属性,同样可以用自定义映射类型来实现。
把Address设计为不可变类,即当创建了这种类的实例以后,就不允许修改它的属性。java中所有基本类型的包装类都是不可变类:Integer,Long等。创建用户自己的不可变类时,可以考虑以下设计模式:
a. 把属性定义为private final类型。
b. 不对外公开set方法
c. 只对外公开get方法
d. 允许在构造方法中设置所有属性。
e. 覆盖Object类的equals和hashCode方法,在equals方法中根据对象的属性值来比较两个对象是否相等,保证用equals方法比较相等的两个对象的hashCode方法返回值也相等。
package mypack;
import java.io.Serializable;
public class Address implements Serializable ...{
private final String province;
private final String city;
private final String street;
private final String zipcode;
public Address(String province, String city, String street, String zipcode) ...{
this.street = street;
this.city = city;
this.province = province;
this.zipcode = zipcode;
}
public String getProvince() ...{
return this.province;
}
public String getCity() ...{
return this.city;
}
public String getStreet() ...{
return this.street;
}
public String getZipcode() ...{
return this.zipcode;
}
public boolean equals(Object o)...{
if (this == o) return true;
if (!(o instanceof Address)) return false;
final Address address = (Address) o;
if(!province.equals(address.province)) return false;
if(!city.equals(address.city)) return false;
if(!street.equals(address.street)) return false;
if(!zipcode.equals(address.zipcode)) return false;
return true;
}
public int hashCode()...{
int result;
result= (province==null?0:province.hashCode());
result = 29 * result + (city==null?0:city.hashCode());
result = 29 * result + (street==null?0:street.hashCode());
result = 29 * result + (zipcode==null?0:zipcode.hashCode());
return result;
}
}
package mypack;
import net.sf.hibernate.*;
import java.sql.*;
public class AddressUserType implements UserType ...{
private static final int[] SQL_TYPES = ...{Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR};
public int[] sqlTypes() ...{ return SQL_TYPES; }
public Class returnedClass() ...{ return Address.class; }
public boolean isMutable() ...{ return false; }
public Object deepCopy(Object value) ...{
return value; // Address is immutable
}
public boolean equals(Object x, Object y) ...{
if (x == y) return true;
if (x == null || y == null) return false;
return x.equals(y);
}
public Object nullSafeGet(ResultSet resultSet,
String[] names,
Object owner)
throws HibernateException, SQLException ...{
if (resultSet.wasNull()) return null;
String province = resultSet.getString(names[0]);
String city = resultSet.getString(names[1]);
String street = resultSet.getString(names[2]);
String zipcode = resultSet.getString(names[3]);
return new Address(province,city,street,zipcode);
}
public void nullSafeSet(PreparedStatement statement,Object value,int index)
throws HibernateException, SQLException ...{
if (value == null) ...{
statement.setNull(index, Types.VARCHAR);
statement.setNull(index+1, Types.VARCHAR);
statement.setNull(index+2, Types.VARCHAR);
statement.setNull(index+3, Types.VARCHAR);
} else ...{
Address address=(Address)value;
statement.setString(index, address.getProvince());
statement.setString(index+1, address.getCity());
statement.setString(index+2, address.getStreet());
statement.setString(index+3, address.getZipcode());
}
}
}
<property name="homeAddress" type="mypack.AddressUserType" >
<column name="HOME_STREET" length="15" />
<column name="HOME_CITY" length="15" />
<column name="HOME_PROVINCE" length="15" />
<column name="HOME_ZIPCODE" length="6" />
</property>
<property name="comAddress" type="mypack.AddressUserType" >
<column name="COM_STREET" length="15" />
<column name="COM_CITY" length="15" />
<column name="COM_PROVINCE" length="15" />
<column name="COM_ZIPCODE" length="6" />
</property>
注:映射文件列的顺序要与自定义type中的列名对应顺序一致,如果不一致可能会取出的数据没错,但是库表中的数据列的位置不一致,同时可能出现类型不匹配。能取出一致数据的地原因是nullSafeSet和nullSafeGet中列的顺序一致!
发表评论
-
Hibernate入门
2010-10-27 00:11 735Java代码 1.public class User { ... -
hibernate二级缓存攻略
2010-10-20 15:31 617很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇 ... -
精通hibernate学习笔记(8-2)[检索方式]
2010-10-19 13:01 7404、报表查询 报表查询用于对数据分组和统计,完整的HQL语 ... -
精通hibernate学习笔记(8)[检索方式]
2010-10-19 13:00 791提供的检索方式: (1)导航对象图检索方式 (2)OID ... -
精通hibernate学习笔记(7)[检索策略]
2010-10-19 12:55 810Customer和Order为例 1、hibernate检索 ... -
精通hibernate学习笔记(4)[操作持久化对象]
2010-10-19 12:47 7131、理解Session的缓存 如果希望一个java对象一直处 ... -
精通hibernate学习笔记(5)[映射组成关系]
2010-10-19 12:46 8781、概念 1.1 聚集关系 在域模型中,有些类由几个 ... -
精通hibernate学习笔记(3)[关联关系]
2010-10-19 12:43 930关联关系分:单向关联 ... -
精通hibernate学习笔记(2)[标志符生成器]
2010-10-19 12:37 5941、increment 标识符生成器 该生成器由Hiber ... -
精通hibernate学习笔记(1)
2010-10-19 12:36 774实体域对象的 持久化模式 1、ORM模式 对象-关 ... -
分析Hibernate的缓存机制
2010-10-19 12:33 628缓存是介于应用程序和 ... -
Hibernate缓存管理
2010-10-19 12:31 6081. Cache简介: 缓存( ... -
Hibernate 学习笔记
2010-10-19 12:28 805原创 hibernate 笔记 收藏 day1 一. h ...
相关推荐
【Hibernate 学习笔记】是针对Java开发人员的一份面试准备资料,主要涵盖了J2EE企业级应用开发中的重要框架Hibernate。...对于J2EE开发者来说,精通Hibernate框架无疑能增加求职的成功率,特别是在高新技术领域。
【Hibernate - Annotation 学习笔记】 Hibernate 是一个流行的开源Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据存储。Annotation是Hibernate提供的一种元...
本教程结合了【Hibernate学习笔记】,提供了全面且深入的讲解,旨在让学习者对Hibernate有透彻的理解并能熟练应用。 首先,Hibernate的核心概念是对象关系映射,它将数据库表与Java类关联,通过面向对象的方式来...
这份"Java从入门到精通全过程笔记"涵盖了从基础概念到高级框架的全面学习路径,旨在帮助初学者快速掌握Java技术。 首先,笔记从Unix/Linux环境开始,这是许多开发人员的基础平台。Unix/Linux系统管理是开发人员必须...
本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...
Hibernate是一个对象关系映射框架,简化了数据库操作。PL/SQL是Oracle数据库的编程语言,用于编写存储过程和触发器。了解这些技术对于开发基于Java的数据驱动应用至关重要。 【Web开发】 Web开发中,JSP(Java...
首先,"精通Hibernate(孙卫琴).pdf"是孙卫琴老师的著作,该书系统地介绍了Hibernate的核心概念和实战技巧。书中涵盖的内容包括:Hibernate概述、环境配置、实体类与表的映射、对象状态管理、持久化操作、查询语言...
3. **精通Hibernate读书笔记.doc**: 这份笔记可能是一位资深开发者的学习心得,可能包含了实战案例、最佳实践以及常见问题的解决方案。笔记通常更加实用,能帮助读者在实际项目中快速解决问题,提高开发效率。 4....
【标题】"北圣思园Hibernate源代码及课件"是...总之,"北圣思园Hibernate源代码及课件"是一份全面的学习资源,不仅提供理论知识,还包含实践经验,对于想深入了解和精通Hibernate的开发者来说,是一份不可多得的宝藏。
这个"Struts2_学习笔记"包含了关于Struts2框架的深入学习资料,是理解并掌握Struts2核心概念和技术的关键。 Struts2的核心设计理念是模型-视图-控制器(MVC)架构模式,它简化了Java Web开发,将业务逻辑、数据展示...
综上所述,这份Java学习笔记为我们提供了一条从零基础到精通Java的详细路径,包括Java基础、Web开发、高级特性、数据库操作以及Linux/Unix命令行操作等内容,为Java学习者提供了一份全面的学习指南。
### Java从入门到精通知识点梳理 #### 一、Java基础知识 - **基本概念**: - Java是一种面向对象的编程语言,由Sun Microsystems公司于1995年发布。 - Java具有简单性、面向对象、分布式、健壮性、安全性、平台...
总结,"精通Struts笔记"将引导初学者逐步理解Struts框架的基本原理和使用技巧,包括MVC模式、配置、ActionForm、表单验证、标签库、国际化、以及与其它框架的集成等。通过深入学习,你可以掌握构建高效、可维护的...
【Java基础】 Java是一种广泛使用的面向对象的编程语言,具有平台...以上是《Java从零基础到精通的整个详细笔记》的主要内容,涵盖了从基础语法到高级框架的广泛知识,适合初学者逐步深入学习Java编程及其相关技术。
- **Hibernate**:一个 ORM (对象关系映射) 框架,用于简化数据库访问。 - **Spring**:一个轻量级的 IoC 容器和 AOP 框架,用于解决企业级应用的复杂性。 - **Ajax**:一种异步通信技术,用于改善用户体验。 ### ...
1. **Hibernateday1.doc** 和 **Hibernateday2.doc**:可能是连续两天的Hibernate学习笔记,可能涵盖了Hibernate的基础知识,包括安装配置、对象关系映射的基本概念等,也有可能涉及HQL的初步介绍。 2. **HQL基础...
【Java从零基础到精通】的学习笔记覆盖了广泛的主题,旨在帮助初学者全面掌握Java编程语言,以及与其相关的技术领域。以下是对各个知识点的详细解释: 1. **Unix**:Unix是一种多用户、多任务的操作系统,是开发和...
这个“NHibernate 笔记文档”是初学者宝贵的资源,包含了NHibernate从基础到进阶的全方位介绍,通过深入学习和实践,可以帮助开发者快速上手并精通NHibernate,从而更好地在.NET项目中应用ORM技术。