资源预览内容
第1页 / 共27页
第2页 / 共27页
第3页 / 共27页
第4页 / 共27页
第5页 / 共27页
第6页 / 共27页
第7页 / 共27页
第8页 / 共27页
第9页 / 共27页
第10页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
三、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.ByteTINYINTshortshort, 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.DateDATEtimejava.util.Date, java.sql.TimeTIMEtimestampjava.util.Date, java.sql.TimeStampTIMESTAMPcalendarjava.util.CalendarTIMESTAMPcalendar_datejava.util.CalendarDateclobjava.sql.ClobCLOBblobjava.sql.BlobBLOBbinarybyteVARBINARY, BLOBtextjava.lang.StringCLOBseralizablejava.io.SerializableVARBINARY, BLOBclassjava.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映射-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启动时间, 内部自增量生成十六进制的数值, 编码后成为一个32位长的字符串. 该方法提供了最好的数据库插入性能和数据库平台适应性. uuid.string: 与uuid.hex类似, 只是生成的主键没有进行编码, 只有16位长度. 在某些数据库可能出错. hilo: 通过hilo算法实现主键生成, 需要额外的数据库表保存主键生成历史状态. seqhilo: 与hilo类似, 只是主键历史状态保存在sequence中, 适用于支持sequence的数据库. increment: 主键按数值递增, 但如果多个实例同时访问同一个数据库, 各自生成主键,则容易造成主键重复. native: 由hibernate根据数据库适配器中的定义, 自动采用identity, hilo, sequence中的一种方式. foreign: 外部表的字段作主键. select: hibernate 3 中新增的.需要提供一个唯一的标识字段进行二次读取, 以获取触发器生成的主键值, 通过param子元素进行定义, 比如: key_field 该方法主要针对遗留系统的改造工程, 一些早期的系统主键依赖于触发器生成. 当数据库insert时, 触发器捕获这一操作, 并为主键赋值, 在插入数据库后, 再次读取某一识别字段读取已经插入的数据, 获取其主键值.5. OR映射-复合主键映射(composite-id)-实体属性组成主键复合主键使用将取代id元素, 并具有property属性列表. 复合主键的POJO类需要实现equals和hashcode方法, 可以使用apache commons lang包中的工具类实现(commons-lang.jar), 比如:import org.apache.commons.lang.builder.EqualsBuilder;import org.apache.commons.lang.builder.HashCodeBuilder;import org.apache.commons.lang.builder.ToStringBuilder;.public String toString() return new ToStringBuilder(this) .append(userid , 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() ) .append(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(.);obj=(MyPoJoClass)session.load(MyPoJoClass.class, obj);6. OR映射-复合主键映射(composite-id)-基于主键类可以用一个独立的类来描述主键, 示例: 此时, 需要定义一个新的类KeyClass来作为主键类, KeyClass实现equals和hashcode方法, 而在POJO中, 使用属性名keyClassProperty来表示主键, 其类类型为KeyClass.7. OR映射-composi
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号