Hibernate——映射文件
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="" table="">
<id name="" type="">
<column name=""></column>
<generator class=""></generator>
</id>
<property name="" type="">
<column name=""></column>
</property>
</class>
</hibernate-mapping>
Hibernate-mapping 中可以同时定义多个类,一般建议每个xml映射文件只定义一个class
hibernate-mapping 有如下属性:
1.package : 可以指定一个包的前缀,如果在映射文档中没有指定全限定的类型,就使用这个作为包名(可在配置多个类时用)
2.default-accsess
3.default-cascade
4.default-lazy
class的属性:
1.name : 指定全类名(如果指定package就是类名)
2.table : 表名
3.dynamic-update:true/false 当更新一个对象时,会动态生成update语句,语句中只包含所需要更新的字段
4.dynamic-insert:true/false 当插入一个对象时,会动态生成insert语句,语句中只包含值不为null的字段
5.select-before-update:true/false 设置是否在更新持久化对象前执行一次select操作(防止频繁执行无用的update)(不建议使用,会降低性能)
id的属性:
1.name:OID属性的名字
2.type: 类中属性的类型
3.unsaved-value : 通过比较OID和此设定值来区分此对象是否时临时对象
3.column(name): 列名(数据库中表的列明)
4.generator(class): 指定如何生成主键,指定标识符生成器
Hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中记录的对应关系.
对象的OID和数据表的主键对应Hibernate通过标识符生成器来为主键赋值
Hibernate 推荐在数据表中使用代理主键,即不具备业务含义的字段,代理主键通常为整数类型
<id> 用于设置对象标识符 <generator> 用于设置表标识符生成器
标识符生成器:
1.increment:
由Hibernate 以递增的方式为代理主键赋值,Hibernate会读取表中主键的最大值,
然后在其基础上递增,会存在并发的问题,同时读取会得到同样的主键值
2.identity:
由底层数据库来负责生成标识符,它要求底层数据库把主键定义为自动增长字段类型(需要数据库支持)
3.sequence:
利用底层数据库提供的序列来生成标识符,先从底层数据库的news seq序列中获得一个唯一的标识号作为主键
<id name="id">
<generator class="sequence">
<param name="sequence">news_seq</param>
</generator>
</id>
4.hilo:
由hibernate按照一种high/low算法*生成标识符,它从数据库的特定表的字段中获取high值,并修改
hilo不依赖底层数据库系统,适用于所有
<id name="id" type="java.lang.Integer">
<column name="ID"></column>
<generator class="hilo">
<param name="table">HI_TABLE</param>
<param name="column">NEXT_VALUE</param>
<param name="max_lo">10</param>
</generator>
</id>
5.native:
依据底层数控对自动生成标识符的支持能力,来选择使用identity,sequence,hilo
适用于跨平台开发
Property:
1.name:属性名
2.type:指定Hibernate映射类型
3.column:表中列名
4.access:访问属性的方式(默认get/set),可以适用映射
5.unique:是否为该属性列所映射的数据列添加唯一约束
6.update:设置此列是否能被修改
7.index:指定一个字符串的索引名称
8.length :设置长度
9.formula:设置一个sql表达式,根据其计算出来的值对应到数据库中
<property name="desc" formula="(select concat(author,':',title)from tb_news n where n.id=ID )"></property>
formula="(sql)" 的英文表达式不可少,sql中的列名和表名都应该和数据库中一致,不是和对象的属性一致
Java时间和日期类型的Hibernate映射:
Java中代表时间和日期的类型包括:java.util.Date,java.util.Calender
在JDBC API中提供了java.util.Date的三个子类:java.sql.Date,java.sql.Time,java.sql.Timestamp
这三个类分别和标准SQL类型的DATE,TIME,TIMESTAMP 对应
DATE(日期),TIME(时间),TIMESTAMP(时间戳,包含日期和时间)
1.使用java.util.Date可以和SQL中三种类型都对应(应为java.util.Date是他们的父类)
2.建议在持久化类中使用java.util.Date,在映射文件的property属性中具体指明类型
映射类型 | Java类型 | 标准SQL类型 | 描述 |
date | java.util.Date java.sql.Date | DATE | yyyy-MM-dd |
time | java.util.Date java.sql.Time | TIME | hh:mi:ss |
timestamp | java.util.Date java.sql.Timestamp | TIMESTAMP | yyyymmddhhmiss |
Java大对象映射:
Java中java.lang.String可用于表示长字符串(长度超过255),字节数组byty[] 可用于存放图片或文件的二进制,JDBC API提供了java.sql.Clob 和java.sql.Blob 类型,分别对应SQL标准中的CLOB和BLOB
映射类型 | Java类型 | 标准SQL | Mysql类型 |
binary | byte[] | VARCHAR(或BLOB) | BLOB |
text | java.lang.String | CLOB | TEXT |
clob | java.sql.Clob | CLOB | TEXT |
blob | java.sql.Blob | BLOB | BLOB |
在实际测试的过程中发现,我们设置映射类型为blob等,数据库生成类型时longblob,并不是我们所需的blob类型,精确映射:
<property name="image">
<column name="images" sql-type="blob"></column>
</property>
存储Blob对象:
Blob blob=null;
InputStream in=new FileInputStream("images/test.png");
blob= Hibernate.getLobCreator(session).createBlob(in,in.available());
映射组成关系:
Hibernate 把 持久化类分为二种:
1.值类型:没有OID,不能被单独持久化,生命周期依赖于所属持久化对象的
2.实体类型:有OID,可以被单独持久化,有独立生命周期
使用Hibernate <component>元素来映射组成关系:
<hibernate-mapping package="com.chenx.hibernate.helloworld">
<class dynamic-update="true" name="Work" table="tb_works">
<id name="id" type="java.lang.Integer">
<column name="ID"></column>
<generator class="native"></generator>
</id>
<property name="name" type="string">
<column name="Name"></column>
</property>
<component name="pay" class="Pay">
<property name="monthlyPay"></property>
<property name="yearPay"></property>
<property name="vocationPay"></property>
</component>
</class>
</hibernate-mapping>