Hibernate类映射文件

一、实体类规范

      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>   
      9Map映射属性
<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>

 
 

你可能感兴趣的:(Hibernate类映射文件)