一、实体类规范
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>