Hibernate 对持久化对象的要求
1、提供一个无参的构造器,使Hibernate可以使用Constructor.newInstance()来实例化持久化类。
注意:在java的类中如果没有指定构造函数,那么会有一个默认的构造函数。如果手动定义了一个有参的构造函数,那么此时默认的无参构造函数 将不存在,应该再定义一个无参构造函数。
2、提供一个标示属性,通常映射为数据库表的主键字段。
3、为持久化类的字段声明get/set 方法
4、使用非final类,如果使用fianl类,会影响懒加载特性。
5、重写equals()和hashCode()方法,如果需要把持久化类的实力放到set集合(当需要进行关联映射时)中,则应该重写这两个方法。
一般每一个实体类对应一个*.hbm.xml文件。配置方法及属性如下:
<hibernate-mapping>
<!--
name属性:哪个类
table属性:对应哪个表,如果不写,默认的表名就是类的简单名称
-->
<class name="edu.fjnu.domain.User" table="t_user">
<id name="id" type="int" column="id">
<generator class="sequence">
<param name="sequence">SEQUENCE_ON_USER</param>
</generator>
</id>
<!--
普通属性(数据库中的基本类型,如字符串、日期、数字等)
name属性:对象的属性名,必须有
type属性:类型,如果不写,Hibernate会自动检测
可以写Java中类的全名
或是写hibernate类型
column属性:对应的表中的列名,如果没有默认为属性名。
length属性:长度,不是所有的类型都有长度属性,比如vachar2有,但int没有,
如果不写默认为255
not-null:非空约束,默认为false
-->
<property name="name" type="string" column="name" length="20" not-null="true"/>
<property name="age" type="int" column="age"/>
<property name="birthday" type="date" column="birthday"/>
<!-- 当列名与关键字冲突时,可以通过column属性指定一个其他的列名。
或是使用反引号包围起来
指定使用text类型时,最好再指定length,以确定生成的SQL类型是能够存放指定数量的字符的
-->
<property name="desc" type="text" length="5000" column="`desc`"/>
<!-- 图片,二进制类型,最好指定长度 -->
<property name="photo" type="binary" length="102400"></property>
</class>
</hibernate-mapping>
映射主键属性
第7行class中可以指定主键生成的策略:
1、identity:使用数据库的自动增长策略,不是所有数据库都支持,比如oracle就不支持
2、sequence:oracle中可以使用序列来让主键自动增长
3、hilo:使用高地位算法来生成的主键值。只需要一张额外的表,所有的数据库都支持
4、native:根据底层数据库能力选择identity、sequence、hilo中的一个。
5、increment:先查询当前最大的id值,再加1使用,由hibernate维护的自动增长,有多线程下会有
6、assigned:手动指定一个主键值
7、uuid:由hibernate自动生成UUID并指定为主键值
<hibernate-mapping package="edu.fjnu.hbm_id">
<class name="User" table="t_user">
<!-- id元素用户映射主键
子元素generator是用于指定主键生成策略的
-->
<id name="id" type="int" column="id">
<generator class="assigned"/>
</id>
<property name="name" type="string" column="name" length="20" not-null="true"/>
</class>
</hibernate-mapping>