持久化类:在应用程序中,用来实现业务问题实体的类(如,在电子商务应用程序中的Customer和Order)就是持久化类。不能认为所有的持久化类的实例都是持久的状态——一个实例的状态也可能是瞬时的或托管的。就如同它的名字暗示的,它的实例会被持久性保存于数据库中。
定义
持久化是将程序数据在持久状态和瞬时状态间转换的机制。
持久化类(persistent class):可以被hibernate保存到数据库,并且从数据库读取的类。
性质
1、持久化类:是指其实例需要被Hibernate持久化到数据库中的类。持久化类符合JavaBean的规范,包含一些属性,以及与之对应的getXXX( )和setXXX( )方法。
注:
(1)get/set方法必须符合特定的命名规则,get和set后面紧跟属性的名字,并且属性名的首字母为大写。
(2)name属性的get方法为getName( ),如果写成getname( )或getNAME( )会导致Hibernate在运行时抛出以下异常:
net.sf.hibernate.PropertyNotFoundException:Could not find a getter for porperty name in class mypack XXX
2、如果持久化类的属性为boolean类型,那么他的get方法名即可以用get作为前缀,也可以用is作为前缀。
3、持久化类有一个id属性,用来唯一标识Account类的每一个对象。这个id属性被称为对象标示符(OID,Object Identifier),通常它都用整数表示。
4、Hibernate要求持久化类必须提供一个不带参的默认构造方法,在程序运行时,Hibernate运用Java反射机制,调用java.Lang.raflect.Constructor.newInstance( )方法来构造持久化类的实例。
应用
1、Account.hbm.
xml文件用于映射Account类,如果需要映射多个持久化类,有两种方法 :
(1)在同一个映射文件中映射所有类;
(2)为每一个类创建单独的映射文件,映射文件最好和类同名,扩展名为hbm.xml(推 荐使用,这有利于在团队开发中维护和管理映射文件) ;
2、映射文件的分析:
元素指定类和表的映射
name:设定类名 table:设定表名
注:如果没写tableHibernate直接以类名作为表名。
(1)子元素设定持久化类的OID和表的主键的映射,元素只有一个子元素。
(2)子元素指定对象标识符生成器,他负责为OID生成唯一标识符。
(3)Hibernate的内置标示符生成器(id生成器):
(a)increment:由Hibernate以递增的方式为代理主键赋值。Hibernate在初始化阶段读取表中最大主键值,然后再最大值的基础上递增,增量为1。
eg .
适用范围:
1、increament不依赖于底层数据库系统,所以适于所有的DBS。
2、适用于只有单个Hibernate应用程序访问同一个DB的场合。
3、OID必须为long、int或short类型,定义为byte类型,在运行时会抛异常。
(b)identity:由底层DB来负责生成,要求底层DB把主键定义为自增类型,例如在SQL Server中,应该把主键定义为identity类型,MySQL中,定义为auto_increment类型。
适用范围:
1、由于identity生成机制依赖于底层DB系统,要求底层DB必须支持自增字段类型。
2、OID必须为long、int或short类型,定义为byte类型,在运行时会抛异常。
(c)sequence:利用底层DB提供的序列生成。
eg.
注:tt_oid_seq 是我们在Oracle中建立的,create sequence tt_oid_seq;
适用范围:
1、sequence依赖于底层DB,要求底层DB系统必须支持序列,eg.Oracle、DB2等
2、OID必须为long、int或short类型,定义为byte类型,在运行时会抛异常。
(d)hilo(高低位算法):由Hibernate按照一种high/low算法来生成标识符,他从DB的特定表的字段中获取high值。
eg .
适用范围:
1〉hilo不依赖于底层DB系统,适用于所有的DBS。
2〉OID必须为long、int或short类型,定义为byte类型,在运行时会抛异常。
3〉hign/low算法生成的标识符只能在一个DB中保证唯一。
4〉当用户为Hibernate自行提供DB连接,或者Hibernate通过JTA,从应用服务器的数据源获得数据库连接时无法使用hilo,因为这不能保证hilo在新的DB连接的事务中访问hi值所在的表,这时如果DBS支持Sequence,可以使用seqhilo来产生OID,seqhilo从名为hi_sequence的序列里获取high值。
(e)native:依据底层数据库自动生成标识符的能力,来选择使用identity、sequence或hilo标识符生成器。它能自动判断底层DB提供的生成标识符的机制。
eg.
适用范围:
1〉适合跨DB平台开发,即同一个Hibernate应用需要连接多种DBS的场合。
2〉OID必须为long、int或short类型,定义为byte类型,在运行时会抛异常。
(a)name:指定持久化类的属性名。
(b)type:指定Hibernate映射类型,Hibernate映射类型是Java类型与SQL类型的桥梁。
(c)not-null:为true,表明不允许为空,默认为false。 (d)column:指定与类属性映射的表的字段名,没设置Hibernate直接以类名作为字段名。
4、Hibernate采用XML文件来配置对象-关系映射,有以下优点:
(1)Hibernate既不会渗透到上层域模型中,也不会渗透到下层数据模型中。
(2)软件开发人员可以独立设计域模型,不必强迫遵守任何规范。
(4)对象-关系不依赖于任何程序代码,如果需要修改对象-关系映射,只需修改XML文件,不需要修改任何程序,提高了软件的灵活性,并且使维护更加方便