详解对象-关系映射文件

Posted yuexiaoyun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解对象-关系映射文件相关的知识,希望对你有一定的参考价值。

一、Hibernate中持久化类编写规范

 

    -必须提供无参数的默认构造方法。因为程序运行时,Hibernate会运用java的反射机制,创建实体类的实例。 

    -所有属性必须提供public访问控制符的set get方法 

    -属性应尽量使用基本数据类型的包装类型(如Integer)
            基本数据类型无法表达null值,所有基本数据类型的默认值都不是null,这样就有很大的缺陷。
            例如有一个score属性,表示学生分数,如果为0,那么是表示该学生未参加考试还是说该学生成绩为0呢?
            这时候如果用包装类型,就可以使用null来表示空值,学生未参加考试等等。

    -不要用final修饰实体(将无法生成代理对象进行优化

 

二、对象标识符

 

在关系数据库中,通过主键来识别记录并保证记录的唯一性。
            主键的要求:不允许为null,不能重复,不能改变

            自然主键:在业务中,某个属性符合主键的三个要求,那么该属性可以作为主键。比如人的身份证就可以当作主键
            代理主键:增加一个不具备任何意义的字段,通常为ID,来作为主键

在java中,按照内存地址不同区分不同的对象。

在Hibernate中通过对象标识符(OID)来维持java对象和数据库表中对应的记录。
与表的代理主键对应,OID也是整数类型,为了保证OID的唯一性和不可变性,通常由Hibernate或者底层数据库库给OID赋值。

 

三、对象-关系映射文件

Hiernate采用XML格式的文件来指定对象和关系数据之间的映射。Hibernate通过这个文件来生成各种sql语句。 命名规则为 实体类名.hbm.xml 应该和实体类放在同一目录下。

<?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">

 <!--根元素,有一常用属性为package,当指定了package时,后面的类名字就可以简短,例如 package="com.cad.domain",后面class标签的name只用写User即可--> 
 <hibernate-mapping>

    <!--class标签指定类和表的对应关系,name为类名,table为表名
        class标签的属性 dynamic-insert属性,默认是false,当我们执行插入语句时,会动态生成sql语句,如果我们只为某个字段赋值,其他字段为null,但是生成的sql语句还是包含其他字段,例如user有两个属性,我们只为name赋值,生成的sql语句还是 insert into user(name,password)values (?,?),而当我们将该值设置为true时,生成的sql语句会仅包含不为null的字段,生成的sql语句就是insert into user(name) values (?) 

        class标签的属性 dynamic-update属性,默认是false,当我们执行更新语句时,会动态生成sql语句,如果我们只为某个字段更新,其他字段不变,生成的sql语句还是包含其他字段。而当我们将该值设置为true时,生成的sql语句仅包含需要更新的字段
        使用上面的两个属性可以提高运行性能,但是Hibernate动态生成sql语句需要的性能很小,所以可以省略-->
    <class name="com.cad.domain.User" table="user"> 

        <!--id标签用来设定持久化类中的OID和表的主键的映射,name为持久化类中的属性,column是数据表中的主键列名
            id标签的属性:length 指定列的数据长度
            id标签的属性:unsaved-value 指定当主键为某个值时,当做null来处理
            id标签的属性:access 也可用在<property>标签上 默认值为property,即通过相应的get set方法来访问持久化类的属性,当值为field时,表明使用反射机制直接访问类的属性,不推荐使用,破坏封装性-->
        <id name="id" column="id">
            <!--
                generator标签用来设定主键生成策略,hibernate内置的几种主键生成策略
                1.increment 适用于代理主键。由Hibernate自动以递增的方式生成主键,每次增量为1 ,会执行两个sql语句,先从表中查找出最大的id,然后加一,插入当前数据
                2.identity  适用于代理主键。由底层数据库生成主键,依赖数据库的主键自增功能
                3.sequence  适用于代理主键。由底层数据库的序列来生成主键,前提是数据库支持序列。(mysql不支持,oracle支持)
                4.hilo      适用于代理主键。Hibernate根据hilo算法来自己生成主键。
                5.native    适用于代理主键。根据底层数据库对自动生成主键的支持能力选择 identity|sequence|hilo
                6.uuid      适用于代理主键。采用UUID算法生成主键。
                7.assigned  适用于自然主键。由我们自己指定主键值。例如指定身份证号为主键值

            -->
            <generator class="native"></generator>
        </id>

        <!--
            property标签属性 name指定持久化类的属性名称
            column 与类属性映射的字段名,如果没有设置,默认用类属性名作为字段名
            not-null  指定属性的约束是否为非空,默认false
            unique   指定属性的约束是否唯一
            type     指定Hibernate映射类型。例如java类型为string,数据库类型为text,那么应该把Hibernate类型设置为Text。有一张对应的表可以查看。如果没有指定映射类型,Hibernate会使用反射机制识别属性的java类型,然后自动使用与之对应的Hibernate映射类型
        -->
        <property name="name" column="name"></property>
        <property name="password" column="password"></property>
    </class>
 </hibernate-mapping>  

  

  

 

  

 

以上是关于详解对象-关系映射文件的主要内容,如果未能解决你的问题,请参考以下文章

django_ORM用法详解

2018.10.7 理解Hibernate的工作原理及其中的ORM详解

Hibernate映射文件详解(News***.hbm.xml)一

Java应用如何使用JPA进行对象关系映射和持久化

SSH:Hibernate框架(七种关联关系映射及配置详解)

Hibernate基础知识详解