一、实体类规范
1、提供一个无参的构造函数(无其他构造方法时则默认存在)
使Hibernate可以使用Constructor.newInstance(),进行实例化
2、提供标示属性(Object identifier-OID),通常为数据库表的主键字段。
缺失时无法判断类是否已存在,如Session.saveOrUpdate().
PS、Hibernate根据实体类的id中的unsaved-value判断对象是否是持久化状态(ID为包装类时默认为null,基础类型为默认 值),当id值等于unsaved-value值,则表示对象未持久化,需添加至数据库。
3、提供属性的get/set方法,以进行注入。
4、需为非final类,以便进行懒加载设置。
二、映射文件
1、命名规范:类名.hbm.xml
2、包映射规范:
(1)<hibernate-mapping package="包名"></hibernate-mapping>
包裹的class若未定义包名,则使用以上包名
3、类映射规范(<class>):
(1)name:类名(类全名或类简单名)
(2)table:对应数据库表名,未定义则为类简单名
4、主键映射规范(<id>):
(1)type:对于基础数据类型,最好使用包装类,以便默认空值可被识别。
(2)子元素generator
1:increment:(由hibernate维护,不推荐使用)
以递增的方式为代理主键赋值,每次维护的当前实例中取出一个最大值,在最大值的基础之上再进行加法
(查看org.hibernate.id.IncrementGenerator 类),不适合集群服务器访问数据的情 况,否则会产生并发冲突问题(主键 重复)。 并且id 的类型必须是long ,int ,short类型的。
2:assigned :由程序员给赋值,(不建议使用)
3:identity:是由底层的数据库来生成主键,他要求底层数据库支持自动增长,并且把主键定义成自动增长类型的 ,
id 必须是long ,int ,short 类型的。 Oracle 不支持,Mysql 支持。
4:sequence:由底层的数据根据序列来生成主键。oracle ,db2数据库支持,mysql不支持 。
5:native:(跨平台的,推荐)
由hibernate 自己跟据不同的数据库的主键生成方式,自己选择生成方式(可以跨平台)
6:hilo :(跨平台的),通过hi/lo算法实现主键的生成机制,但是需要额外的表来保存主键的生成历史,使用时要先插入一个 值。
7:seqhilo:取得sequence的值,来生成高位,产生id。
但是只能使用于有sequence的数据库(oracle , db2);
8:uuid.hex:
用系统时间和ip地址等具有天然唯一性的资源进行计算,生成id, 全球唯一。生成的是一个128位的二进制数。然后把这个 二进制数,转化成一个16进制的数(32位),再转化为字符串付给我们的id。那么我们的实体类的oid以及数据库的主键都需 要随之改为字符串类型的。
9:foreign
用于共享主键的时候。(一对一主键关联);
5、类普通属性规范(<property>),数据库基础类型:
(1)name: 对象中的属性名,必须。
(2)type:数据类型,未定义则自动检测匹配类型
Hibernate映射类型 | Java类型 | 标准SQL类型 |
integer、int | java.lang.Integer或int | INTEGER |
long | java.lang.Long或long | BIGINT |
short | java.lang.Short或short | SMALLINT |
float | java.lang.Float或float | FLOAT |
double | java.lang.Double或double | DOUBLE |
big_decimal | java.math.BigDecimal | NUMERIC |
character | java.lang.String | CHAR(1) |
string | java.lang.String | VARCHAR |
byte | byte或java.lang.Byte | TINYINT |
boolean | boolean或java.lang.Boolean | BIT |
(续表)
Hibernate映射类型 | Java类型 | 标准SQL类型 |
yes_no | boolean或java.lang.Boolean | CHAR(1)('Y'或'N') |
true_false | boolean或java.lang.Boolean | CHAR(1)('Y'或'N') |
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(YYYY-MM-DD HH:MI:SS) |
calendar | java.util.Calendar | TIMESTAMP |
calendar_date | java.util.Calendar | DATE |
binary | byte[] | VARBINARY或BLOB |
text | java.lang.String | CLOB |
serializable | java.io.Serializable实例 | VARBINARY或BLOB |
clob | java.sql.Clob | CLOB |
blob | java.sql.Blob | BLOB |
class | java.lang.Class | VARCHAR |
locale | java.util.Locale | VARCHAR |
timezone | java.util.TimeZone | VARCHAR |
currency | java.util.Currency | VARCHAR |
(3)column: 数据表中的列名,未定义则为name
子属性sql-type:表示数据表字段类型,不兼容多版本数据库
(4)length : 表数据长度,varchar等有,未定义默认为255
(5)not-null:非空约束,未定义默认为false
PS、使用集合属性,经过Session操作后,集合变成Hibernate自己的集合实现了。
所以类中不能声明为具体实现类,而应为接口(Set、List、Map等)
6、Set映射属性
<set name="类中Set类型属性名" table="对应的从表名">
<key column="从表中的外键名,默认关联主表主键"></key>
<element type="value类型" column="表中value列名"></element>
</set>
(1)sort属性:允许的值包括 unsorted(默认,不排序)
,natural(自然排序)
和某个实现了 java.util.Comparator
的类的名称
sort表示从数据库中无序查出数据,然后使用SortSet类型进行排序(低效)。
所以实体类中属性不能为HashSet类型,应为TreeSet。
(2)order-by属性:列名 asc(默认)|desc
通过为sql语句添加order by条件,使用执行排序(高效)。
所以实体类中属性为LinkedHashSet。
7、List映射属性
<list name="类中List类型属性名" table="对应的从表名">
<key column="从表中的外键名,默认关联主表主键"></key>
<list-index column="从表中标示存放顺序的列名"></list-index>
<element type="value类型" column="表中value列名"></element>
</list>
8、数组映射属性
<array name="类中数组类型属性名" table="对应的从表名">
<key column="从表中的外键名,默认关联主表主键"></key>
<list-index column="从表中标示存放顺序的列名"></list-index>
<element type="value类型" column="表中value列名"></element>
</array>
9、
Map映射属性
<map name="类中Map类型属性名" table="对应的从表名">
<key column="从表中的外键名,默认关联主表主键"></key>
<map-key type="类中map集合key的属性" column="从表中保存map的key值列名"></map-key>
<element type="value类型" column="表中value列名"></element>
</map>
<span style="font-family:microsoft yahei;color:#555555;font-size: 13.3333px;"><span style="font-size: 15px; line-height: 35px;">10</span></span><span style="font-size: 13.3333px;">、</span><span style="color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px;">Bag映射属性(无序,可重复)</span>
</pre><pre name="code" class="html">java中没有对应类型,使用List进行接收
<bag name="类中bag类型属性名" table="对应的从表名">
<key column="从表中的外键名,默认关联主表主键"></key>
<element type="value类型" column="表中value列名"></element>
</bag>