ORMObjectRelationalMapper---Hibernate对象映射.doc

上传人:本田雅阁 文档编号:2726421 上传时间:2019-05-08 格式:DOC 页数:27 大小:175.50KB
返回 下载 相关 举报
ORMObjectRelationalMapper---Hibernate对象映射.doc_第1页
第1页 / 共27页
ORMObjectRelationalMapper---Hibernate对象映射.doc_第2页
第2页 / 共27页
ORMObjectRelationalMapper---Hibernate对象映射.doc_第3页
第3页 / 共27页
ORMObjectRelationalMapper---Hibernate对象映射.doc_第4页
第4页 / 共27页
ORMObjectRelationalMapper---Hibernate对象映射.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《ORMObjectRelationalMapper---Hibernate对象映射.doc》由会员分享,可在线阅读,更多相关《ORMObjectRelationalMapper---Hibernate对象映射.doc(27页珍藏版)》请在三一文库上搜索。

1、三、ORM(Object/Relational Mapper)-Hibernate对象映射 一. ORM(Object/Relational Mapper)1. OR映射-Hibernate基本数据类型Hibernate基本类型Java类型标准SQL字段类型booleanboolean, java.lang.BooleanBITyes_noboolean, java.lang.BooleanCHAR(1) ( Y/N)true_falseboolean, java.lang.Boolean CHAR(1) ( Y/N)bytebyte, java.lang.ByteTINYINTshortsh

2、ort, java.lang.ShortSMALLINTintegerint, java.lang.IntegerINTEGERlonglong, java.lang.LongBIGINTfloatfloat, java.lang.FloatFLOATdoubledouble, java.lang.DoubleDOUBLEbig_decimaljava.math.BigDecimalNUMBERICcharacterjava.lang.StringCHAR(1)stringjava.lang.StringVARCHARdatejava.util.Date, java.sql.DateDATEt

3、imejava.util.Date, java.sql.TimeTIMEtimestampjava.util.Date, java.sql.TimeStampTIMESTAMPcalendarjava.util.CalendarTIMESTAMPcalendar_datejava.util.CalendarDateclobjava.sql.ClobCLOBblobjava.sql.BlobBLOBbinarybyteVARBINARY, BLOBtextjava.lang.StringCLOBseralizablejava.io.SerializableVARBINARY, BLOBclass

4、java.lang.ClassVARCHARlocaljava.util.LocaleVARCHARtimezonejava.util.TimeZoneVARCHARcurrencyjava.util.CurrencyVARCHAR2. OR映射-实体映射示例*.hbm.xml, 主体内容包含表/类映射, id映射, 属性字段映射三个部分.示例文件: XML文件头定义了文件的编码方式, DTD与Hibernate的版本有关, 上面是使用hibernate 3.x使用的DTD.3. OR映射-表/类映射name: 指定了Java数据封装的POJO类类型.table: 指定了数据库的表名4. OR

5、映射-id映射 name: 指定了映射POJO类的属性名,type: POJO类中属性的数据类型;column: 数据库表的主键字段;generator子元素:由其class属性指定主键生成方式: assigned: 主键由应用程序产生, 不需要hibernate干预 identity: 使用数据库的主键生成机制, 如MySQL, DB2、SQL Server的自增主键. sequence: 使用数据库的sequence机制, 如Oracle的sequence uuid.hex: 由Hibernate基于128位唯一值产生算法, 根据ip, 时间, jvm启动时间, 内部自增量生成十六进制的数

6、值, 编码后成为一个32位长的字符串. 该方法提供了最好的数据库插入性能和数据库平台适应性. uuid.string: 与uuid.hex类似, 只是生成的主键没有进行编码, 只有16位长度. 在某些数据库可能出错. hilo: 通过hilo算法实现主键生成, 需要额外的数据库表保存主键生成历史状态. seqhilo: 与hilo类似, 只是主键历史状态保存在sequence中, 适用于支持sequence的数据库. increment: 主键按数值递增, 但如果多个实例同时访问同一个数据库, 各自生成主键,则容易造成主键重复. native: 由hibernate根据数据库适配器中的定义,

7、自动采用identity, hilo, sequence中的一种方式. foreign: 外部表的字段作主键. select: hibernate 3 中新增的.需要提供一个唯一的标识字段进行二次读取, 以获取触发器生成的主键值, 通过param子元素进行定义, 比如: key_field 该方法主要针对遗留系统的改造工程, 一些早期的系统主键依赖于触发器生成. 当数据库insert时, 触发器捕获这一操作, 并为主键赋值, 在插入数据库后, 再次读取某一识别字段读取已经插入的数据, 获取其主键值.5. OR映射-复合主键映射(composite-id)-实体属性组成主键复合主键使用将取代id

8、元素, 并具有property属性列表. 复合主键的POJO类需要实现equals和hashcode方法, 可以使用apache commons lang包中的工具类实现(commons-lang.jar), 比如:import mons.lang.builder.EqualsBuilder;import mons.lang.builder.HashCodeBuilder;import mons.lang.builder.ToStringBuilder;.public String toString() return new ToStringBuilder(this) .append(user

9、id , getUserid () .append(when, getWhen () .toString(); public boolean equals(Object other) if(!(other instanceof MyPoJoClass) return false; MyPoJoClass castOther=( MyPoJoClass)other; return new EqualsBuilder() .appendSuper(super.equals(other) .append(this.getUserid (),castOther.getUserid() ) .appen

10、d(this.getWhen (),castOther.getWhen() ) .isEquals(); public int hashCode() return new HashCodeBuilder() .appendSuper(super.hashCode() ) .append(getUserid () .append(getWhen () .toHashCode(); 装载复合主键的记录时, 考虑把类对应的对象的主键值填充好后作为load的第二个参数.MyPoJoClass obj = new MyPoJoClass();obj.setUserid(.);obj.setWhen(.)

11、;obj=(MyPoJoClass)session.load(MyPoJoClass.class, obj);6. OR映射-复合主键映射(composite-id)-基于主键类可以用一个独立的类来描述主键, 示例: 此时, 需要定义一个新的类KeyClass来作为主键类, KeyClass实现equals和hashcode方法, 而在POJO中, 使用属性名keyClassProperty来表示主键, 其类类型为KeyClass.7. OR映射-composite-id其他子节点composite-id除了key-property子节点外, 还具有可选子节点.完整的节点内容: . . 8.

12、OR映射-属性/字段映射name: POJO类的属性名,type: POJO类中属性的数据类型; 如果是字符串,可以省略column: 数据库中的字段名. 如果和属性同名, 可以省略.9. OR映射-自定义数据类型 UserType, CompositeUserType接口hibernate3 中的为: org.hibernate.usertype(hibernate2中为net.sf包)下面的两个接口: UserType 和 CompositeUserType . 它们提供自定义类型的规范, 这里以UserType为例.package org.hibernate.usertype;impor

13、t java.io.Serializable;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import org.hibernate.HibernateException;public interface UserType /* 返回本类型所映射的SQL类型, 返回的是int数组. 可以取java.sql.Types中的int静态常量. * 比如有: public final static int DOUBLE = 8; */ public int sqlType

14、s(); /* * 定义本类型的nullSafeGet() 方法返回的数据的类型 */ public Class returnedClass(); /* 定义两个数据的比较方法, 返回true表示相等, false表示不等. */ public boolean equals(Object x, Object y) throws HibernateException; /* * Get a hashcode for the instance, consistent with persistence equality */ public int hashCode(Object x) throws

15、HibernateException; /* * 定义从ResultSet中读取数据并转换成自定义类型的方法, 对数据库null应该考虑 * 参数names 包含了当前自定义类型的映射字段名称 */public Object nullSafeGet(ResultSet rs, String names, Object owner) throws HibernateException, SQLException; /* * Hibernate进行数据保存时被调用的方法 * param st a JDBC prepared statement * param value the object to

16、 write, 类型应该是returnedClass()方法返回的Class指定的类型 * param index statement parameter index * throws HibernateException * throws SQLException */ public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException; /* * 自定义的对象复制方法, 用作构造返回对象. * nullSafeGet方法被调用后, Hib

17、ernate获得了自定义数据对象, * 这个对象成为数据库读出的原始对象, 通过deepCopy方法, Hibernate* 返回一个复本给用户. 脏数据检查时, 如果两个对象不等(equals方法返回false),* 就会执行数据库持久化操作. * param value the object to be cloned, which may be null * return Object a copy */ public Object deepCopy(Object value) throws HibernateException; /* * Are objects of this type

18、 mutable? * 本类型实例是否可变 * return boolean */ public boolean isMutable(); /* 把对象转化为二级缓存中保存. 经常把当前对象对其他对象的引用, 保存为其id值. * Transform the object into its cacheable representation. At the very least this * method should perform a deep copy if the type is mutable. That may not be enough * for some implementat

19、ions, however; for example, associations must be cached as * identifier values. (optional operation) * * param value the object to be cached * return a cachable representation of the object * throws HibernateException */ public Serializable disassemble(Object value) throws HibernateException; /* * 把

20、二级缓存中获取的数据转换为自定义的对象数据 * Reconstruct an object from the cacheable representation. At the very least this * method should perform a deep copy if the type is mutable. (optional operation) * * param cached the object to be cached * param owner the owner of the cached object * return a reconstructed obje

21、ct from the cachable representation * throws HibernateException */ public Object assemble(Serializable cached, Object owner) throws HibernateException; /* * During merge, replace the existing (target) value in the entity we are merging to * with a new (original) value from the detached entity we are

22、 merging. For immutable * objects, or null values, it is safe to simply return the first parameter. For * mutable objects, it is safe to return a copy of the first parameter. For objects * with component values, it might make sense to recursively replace component values. * * param original the valu

23、e from the detached entity being merged * param target the value in the managed entity * return the value to be merged */ public Object replace(Object original, Object target, Object owner)throws HibernateException;如果一个用户具有多个email, 可以分别定义多个字段保存, 也可以定义一个子表专门保存, 但都有点大动干戈. 可以考虑用一个字符串字段保存, 相邻的email用一个;隔

24、开. 比如:package cn.thinkmore.hibernate.pojo;import java.io.Serializable;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Types;import java.util.*;import org.hibernate.Hibernate;import org.hibernate.HibernateException;import org.hibernate.usertype

25、.UserType;public class EmailList implements UserType private static final String SPLITTER = ; private static final int TYPES = new int Types.VARCHAR ; public Object assemble(Serializable cached, Object owner) throws HibernateException return null; public Object deepCopy(Object value) throws Hibernat

26、eException if (!(value instanceof List) return null; List src = (List) value; List tar = new ArrayList(); tar.addAll(src); return tar; public Serializable disassemble(Object value) throws HibernateException return null; public boolean equals(Object x, Object y) throws HibernateException if (x = y) r

27、eturn true; if (x != null & y != null) List xList = (List) x; List yList = (List) y; if (xList.size() != yList.size() return false; for (int i = 0; i xList.size(); i+) String strX = xList.get(i).toString(); String strY = yList.get(i).toString(); if (!strX.equals(strY) return false; return false; pub

28、lic boolean isMutable() return false; public Object nullSafeGet(ResultSet rs, String names, Object owner) throws HibernateException, SQLException String value = Hibernate.STRING.nullSafeGet(rs, names0).toString(); if(null!=value) return parse(value); return null; private List parse(String value) Str

29、ing strs = mons.lang.StringUtils.split(value,SPLITTER); List emails = new ArrayList(); for(int i=0; istrs.length;i+) emails.add(strsi); return emails; private String assemble(List list) StringBuilder sb = new StringBuilder(); int maxIndex = list.size()-1; for(int i=0; imaxIndex;i+) sb.append(list.ge

30、t(i).append(SPLITTER); if(0=maxIndex) sb.append(list.get(maxIndex); return sb.toString(); public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException if(null!=value&(value instanceof List) String str = assemble(List)value); Hibernate.STRING.nullSafe

31、Set(st,str,index); else if(null!=value) Hibernate.STRING.nullSafeSet(st,value.toString(), index); else Hibernate.STRING.nullSafeSet(st,null, index); public Object replace(Object original, Object target, Object owner) throws HibernateException return null; public Class returnedClass() return List.cla

32、ss; public int sqlTypes() return TYPES; public int hashCode(Object x) throws HibernateException return 0; 数据关联关系数据关联关系在实体的子类里面不会被自动继承.10. 一对一关联 - 主键关联 one-to-one一对一的主键关联, 指两个表的记录是一对一的关系, 且一个表的主键取为另一个表对应的记录的主键. name: 属性名class: java全路径类名cascade: 是否级连操作, all , noneouter-join: 是否外链接, true/false citizen Constrained: 次关联中的约束方.Session s = HibernateSession3.getSession(); Citizen one = new Citizen(); one.setIdcard(123456789012345678); one.setName(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1