一.关系数据库按主键区分不同的记录
在关系数据库表中,用主键来标识记录保证每条记录的唯一性, 作为主键的字段必须满足以下条件:
.不允许为null
.每条记录具有唯一的主键值,不允许主键值重复
.每条记录的主键值永远不会改变
在CUSTOMERS表中,如果把NAME字段作为主键,前提条件是:
.每条记录的客户姓名不允许为null
.不允许客户重名
.不允许修改客户姓名
NAME字段是具有业务含义的字段,把这种字段作为主键,成为自然主键。尽管也是可行的,但是不能满足不断变换的业务需求,一旦出现了允许客户重名的业务需求,就必须修改数据模型,重新定义表的主键,这给数据库的维护增加了难度。
因此,更合理的方式是使用代理主键,既不具备业务的字段,该字段一般取名为"ID"。代理主键通常为整数类型,因为整数类型比字符串类型要节省更多的数据库空间。那么代理主键的值从何而来呢?许多数据库系统提供了自动生成代理主键值的机制。如下
1.把主键定义为自动增长标识符类型
2.从序列中获取自动增长的标识符
二.java语言按内存地址不同区分不同的对象
在java语言中,判断两个对象变量是否相等,有以下两种比较方式
1.比较两个变量所引用的对象的内存地址是否相同
2.比较两个变量所引用的对象的值是否相同
三.Hibernate用对象标识符(OID)来区分对象
从以上两节可以看出,java语言安内存地址来识别或区分同一个类的不同对象,而关系数据库安主键值来识别或区分同一个表的不同记录,Hibernate使用OID来统一两者之间的矛盾,OID是关系数据库中的主键,在java对象模型中的等价物。在运行时,Hibernate根据OID来维持数据库表中记录的对应关系。
四. Hibernate的内置标识符生成器的用法
定义了对象-关系映射文件,然后分别通过hbm2ddl和hbm2java工具,来生成数据库Schema和持久化类源代码。
映射文件:
1.IncrcmentTester.hbm.xml:演示increment标识符生成器的用法
2.IdentitYTester.hbm.xml:演示identity标识符生成器的用法
3.NativeTester.hbm.xml:演示native标识符生成器的用法
五.映射自然主键
1.映射单个自然主键
2.映射复合自然主键(还在了解中)
总结: