2.hibernate.cfg.xml的样板:
Xml代码 ![]()
|
|
步骤五:使用Hibernate API
Java代码 ![]()
|
五、 Hibernate主键策略(上面的步骤三的一部分)
主键:在关系数据库中,主键用来标识记录并保证每条记录的唯一性(一般可保证全数据库唯一)。必须满足以下条件:
1)不允许为空。
2)不允许主键值重复。
3)主键值不允许改变。
1.自然主键:以有业务含义的字段为主键,称为自然主键。
优点:不用额外的字段。
缺点:当业务需求发生变化时,必须修改数据类型,修改表的主键,增加了维护数据库的难度。
2.代理主键:增加一个额外的没有任何业务含义的一般被命名为ID的字段作为主键。
缺点:增加了额外字段,占用部分存储空间。
优点:提高了数据库设计的灵活性。
Hibernate用对象标识(OID)来区分对象:
Student stu = (Student)session.load(Student.class,101); //这代码加载了OID为101的Student对象
Hibernate推荐使用代理主键,因此Hibernate的OID与代理主键对应,一般采用整数型,包括:short、int、long。
1、主键生成策略: (Hibernate支持多种主键生成策略)
generator节点中class属性的值:
1) assigned:assigned:由用户自定义ID,无需Hibernate或数据库参与。是
2) hilo:通过hi/lo(高/低位)算法生成主键,需要另外建表保存主键生成的历史状态(这表只需要一个列和高位初始值)。
hi/lo算法产生的标识只在一个特定的DB中是唯一的。所有数据库都可用。
如果同一个数据库里多张表都需要用;可以建多张主键表,也可以共用同一字段,但最好是用同一张主键表的不同字段。
high_val
nextval
5
3) sequence:采用数据库提供的Sequence机制。
Oracle,DB2等数据库都提供序列发生器生成主键,Hibernate也提供支持。
序列名
4) seqhilo:功能同hilo,只是自动建表保存高位值。主键生成的历史状态保存在Sequence中。
只能用于Oracle等支持Sequence的数据库。
high_val_seq
5
5) increment:主键按数值顺序递增。
作用类型:long,short,int
使用场景:在没有其他进程同时往同一张表插数据时使用,在cluster下不能使用
6) indentity:采用数据库提供的主键生成机制。特点:递增。(Oracle不支持)
通常是对DB2,Mysql, MS Sql Server, Sybase, Hypersonic SQL(HSQL)内置的标识字段提供支持。
返回类型:long,short, int
注:使用MySql递增序列需要在数据库建表时对主健指定为auto_increment属性。用Hibernate建表则不需要写。
(oid int primary key auto_increment)
7) native:由Hibernate根据底层数据库自行判断采用indentity, hilo或sequence中的一种。
是最通用的实现,跨数据库时使用。Default.sequence为hibernate_sequence
8) foreign:由其他表的某字段作为主键,通常与
car
9) UUID:
uuid.hex:由Hibernate基于128位唯一值产生算法生成十六进制数(长度为32的字符串---使用了IP地址)。
uuid.string:与uuid.hex一样,但是生成16位未编码的字符串,在PostgreSQL等数据库中会出错。
特点:全球唯一;ID是字符串。
10)select:通过DB触发器(trigger)选择一些唯一主键的行,返回主键值来分配主键
11)sequence-identity:特别的序列发生策略,使用DB序列来生成值,通常与JDBC3的getGenneratedKeys一起用,使得在执行insert时就返回生成的值。Oracle 10g(支持JDK1.4)驱动支持这一策略。
2、复合主键策略
步骤一:创建数据库表,设定联合主键约束
步骤二:编写主持久化类以及主键类;编写主键类时,必须满足以下要求:
1)实现Serializable接口
2)覆盖equals和hashCode方法
3)属性必须包含主键的所有字段
步骤三:编写*.hbm.xml配置文件
六、 Hibernate的查询方案(应该熟悉各种查询的使用方法)
1、利用Session接口提供的load方法或者get方法
2、Hibernat