1背景 :在使用hibernate的过程中,遇到了联合主键的困境。
由于原有项目是原生的java语言写的,而现在需要使用hibernate重写。原有的数据库表的设计中,很多表中都是用了联合主键 ,因为这样的设计符合业务上的概念,而且原生的jdbc数据库访问也不存在使用联合主键的困难。
但是,现在一切变了,一方面,我们享受者hibernate的面向对象的变量;一方面,却要忧虑不能使用hibernate的原有功能时的无所是从。
我在网上搜集了一些讨论,结论是除非你真的精通hibernate,否则不要使用hibernate的联合主键功能,因为这会给你带来很多意外的烦恼。幸好,以前的项目也是我写的,因此,
我决定把数据库改了,原来正在运行基于原生java语言开发的项目也响应更改。
2 因此接下来要讨论如何改的问题,如何能够尽量不影响原来项目的运行,而又能以最小的工作量解决当前项目的困境呢,这就牵涉到了本文要讨论的概念了,
逻辑主键和业务主键—— 我的理解如下
逻辑主键---通俗的说,是给机器的,它的目的是让机器能够正确标识记录
业务主键----是给人(程序员)来理解的,它的目的是让我们更好的理解项目的设计思想,以便于开发。
举个例子:我原来的项目中 有2个表
sh_device 主键 dev_GUID
sh_maintain 主键 ma_dev_GUID, ma_order
在sh_maintain 中,使用了联合主键,其中ma_dev_GUID关联了sh_device的dev_GUID,
ma_order 表示在某一个设备下的维修记录顺序号比如 1,2,3...,是一个局部的值。在不同的dev_GUID下可以重复。
这里 的ma_dev_GUID和ma_order就可以理解为业务主键,因为它表示了我们的设计意图
现在,使用hibernate开发时,由于使用联合主键实施开发时有困难,需要把联合主键改为 单一主键。
因此,可以为sh_maintain 增加一个字段 比如ma_GUID作为主键, 用来唯一标示记录,原来的2个字段的主键标识取消,但是保留这2个字段的,以便原来的程序能继续运行。这个ma_GUID就可以认为是逻辑主键,虽然它不如以前的双主键更清晰的表达设计意图,但是却能够让机器更好的执行。