Hibernate——映射文件

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>
发布了73 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/daguniang123/article/details/94005700