Hibernate中的持久化类

1.编写规则

    提供一个无参数 public访问控制符的构造器

    提供一个标识属性,映射数据表主键字段

    所有属性提供public访问控制符的 set  get 方法(javaBean)

    标识属性应尽量使用基本数据类型的包装类型

 

    不要用final修饰实体 (将无法生成代理对象进行优化)

2.持久化对象的唯一标识 OID

l  Java按地址区分同一个类的不同对象.

l  关系数据库用主键区分同一条记录

l  Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系

 

结论: 对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID赋值

3.区分自然主键和代理主键

l  主键需要具备: 不为空/不能重复/不能改变

              自然主键:      在业务中,某个属性符合主键的三个要求.那么该属性可以作为主键列.

 

              代理主键:     在业务中,不存符合以上3个条件的属性,那么就增加一个没有意义的列.作为主键.

4.基本数据类型和包装类

l  基本数据类型和包装类型对应hibernate的映射类型相同

l  基本类型无法表达null、数字类型的默认值为0

 

l  包装类默认值是null。当对于默认值有业务意义的时候需要使用包装类。

Java数据类型

Hibernate数据类型

标准SQL数据类型
(PS:
对于不同的DB可能有所差异)

bytejava.lang.Byte

byte

TINYINT

shortjava.lang.Short

short

SMALLINT

intjava.lang.Integer

integer

INGEGER

longjava.lang.Long

long

BIGINT

floatjava.lang.Float

float

FLOAT

doublejava.lang.Double

double

DOUBLE

java.math.BigDecimal

big_decimal

NUMERIC

charjava.lang.Character

character

CHAR(1)

booleanjava.lang.Boolean

boolean

BIT

java.lang.String

string

VARCHAR

booleanjava.lang.Boolean

yes_no

CHAR(1)('Y''N')

booleanjava.lang.Boolean

true_false

CHAR(1)('Y''N')

java.util.Datejava.sql.Date

date

DATE

java.util.Datejava.sql.Time

time

TIME

java.util.Datejava.sql.Timestamp

timestamp

TIMESTAMP

java.util.Calendar

calendar

TIMESTAMP

java.util.Calendar

calendar_date

DATE

byte[]

binary

VARBINARYBLOB

java.lang.String

text

CLOB

java.io.Serializable

serializable

VARBINARYBLOB

java.sql.Clob

clob

CLOB

java.sql.Blob

blob

BLOB

java.lang.Class

class

VARCHAR

java.util.Locale

locale

VARCHAR

java.util.TimeZone

timezone

VARCHAR

java.util.Currency

currency

VARCHAR

5.普通属性

<hibernate-mapping> 
            package 用于配置PO类所在包
                例如: package="com.itheima.d_hbm"
        <class> 配置 PO类 和 表 之间对应关系
            name:PO类全限定类名
                例如:name="com.itheima.d_hbm.Person"
                如果配置 package,name的取值可以是简单类名 name="Person"
            table : 数据库对应的表名
            dynamic-insert="false" 是否支持动态生成insert语句
            dynamic-update="false" 是否支持动态生成update语句
                如果设置true,hibernate底层将判断提供数据是否为null,如果为null,insert或update语句将没有此项。
        普通字段
            <property>
                name : PO类的属性
                column : 表中的列名,默认name的值相同
                type:表中列的类型。默认hibernate自己通过getter获得类型,一般情况不用设置
                    取值1: hibernate类型
                        string 字符串
                        integer 整形
                    取值2: java类型 (全限定类名)
                        java.lang.String 字符串
                    取值3:数据库类型
                        varchar(长度) 字符串
                        int 整形
                        <property name="birthday">
                             <column name="birthday" sql-type="datetime"></column>
                         </property>
                         javabean 一般使用类型 java.util.Date
                         jdbc规范提供3中
                             java类型                mysql类型
                             java.sql.Date        date
                             java.sql.time        time
                             java.sql.timestamp    timestamp
                             null                datetime
                             
                             以上三个类型都是java.util.Date子类
                             
                length : 列的长度。默认值:255
                not-null : 是否为null
                unique : 是否唯一
                access:设置映射使用PO类属性或字段
                    property : 使用PO类属性,必须提供setter、getter方法
                    field : 使用PO类字段,一般很少使用。
                insert 生成insert语句时,是否使用当前字段。
                update 生成update语句时,是否使用当前字段。
                    默认情况:hibernate生成insert或update语句,使用配置文件所有项
        注意:配置文件如果使用关键字,列名必须使用重音符    
            

6.主键

<id>配置主键
                name:属性名称
                access="" 设置使用属性还是字段
                column=""  表的列名
                length=""  长度
                type="" 类型
            <generator> class属性用于设置主键生成策略
                1.increment 由hibernate自己维护自动增长
                    底层通过先查询max值,再+1策略
                    不建议使用,存在线程并发问题
                2.identity hibernate底层采用数据库本身自动增长列
                    例如:mysql auto_increment
                3.sequence hibernate底层采用数据库序列
                    例如:oracle 提供序列
                4.hilo 
                    
                    </generator>
                5.native 根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。【】
                ##以上策略使用整形,long, short 或者 int 类型
                6.uuid 采用字符串唯一值【】
                ##以上策略 代理主键,有hibernate维护。
                7.assigned 自然主键,由程序自己维护。【】

 

posted @ 2018-01-13 20:43  啸傲风月  阅读(185)  评论(0编辑  收藏  举报