1.2.3 身份的问题

rel="File-List" href="file:///C:/DOCUME%7E1/etrust/LOCALS%7E1/Temp/msoclip1/06/clip_filelist.xml">

虽然在刚开始的时候,对象身份的问题并不明显,但是随着我们的电子商务系统不断的扩展的时候,这个问题会经常遇到。我们举个例子来说明这个问题,考虑两个对象(例如,两个User),我们来检查它们是否相同。解决这个问题有3中方案,其中使用Java解决有两种,另外一种则属于SQL数据库。当然,我们需要作出一些调整才能保证它们在一起工作。

Java中,使用两种方法来判断对象是否相同:

(1)      对象的ID(是否引用的内存中同一位置的对象,a==b

(2)      通过实现eauqls方法来判断

SQL数据库中,数据行的标识是主键。在3.4节中可以看到,无论是==还是equals()都不能表示数据库中的主键。在程序中,几个对象同时对应数据库的某一行是很常见的现象。更进一步说,正确的实现一个持久类的equals()方法并不是一件容易的事情。

我们举例说明关于数据库数据标志的另外一个问题。在USER表的定义中,我们使用USERNAME作为主键。不幸的是,这给修改USERNAME带来了麻烦:我们不仅要修改USER表中的USERNAME,同时也要修改其关联的BILLINGDETAILSUSERNAME。因此,我们推荐使用一个专门的键位。这个专门的键位对于USER来说,没有任何的意义。举例来说,我们修改表的定义如下:

create table USER(

USER_ID BIGINT NOT NULL PRIMARY KEY,

USERNAME VARCHAR(15) NOT NULL UNIQUE,

NAME VARCHAR(50) NOT NULL,

….

)

create table BILLINGDETAILS(

BILLING_DETAILS_ID BIGINT NOT NULL PRIMARY KEY,

ACCOUNT_NUMBER VARCHAR(10) NOT NULL UNIQUE,

ACCOUNT_NAME VARCHAR(50) NOT NULL,

ACCOUNT_TYE VARCHAR(2) NOT NULL,

USER_ID BIGINT FOREIGN KEY REFERENCES USER,

)

USER_IDBILLING_DETAILS_ID列的值由系统生成,这些列的引入都是为了方便的使用关系模型。怎样才能把它们表现在对象模型中呢?在3.4节,我们来讨论对象/关系映射的解决方案。

在持久化的时候,身份标识和系统的缓存,事务密切相关。不同的持久化方案使用了不同的策略,这就带来许多不便之处。本书中也包含了这样的主题,我们将在第五章了来讨论。

我们所设计和实现的电子商务框架能很好的实现我们所需的功能。我们也找出了对象映射中可能存在的问题包括映射粒度,继承以及对象身份。现在我们已经准备好进行下一步了。但是首先,我们要讨论一下关联的问题,关联指的是我们映射的类和要处理的类之间的关系。在程序中,我们是否需要数据库的外键?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值