(三)Hibernate对象-关系映射文件
一、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>