虽然在刚开始的时候,对象身份的问题并不明显,但是随着我们的电子商务系统不断的扩展的时候,这个问题会经常遇到。我们举个例子来说明这个问题,考虑两个对象(例如,两个User),我们来检查它们是否相同。解决这个问题有3中方案,其中使用Java解决有两种,另外一种则属于SQL数据库。当然,我们需要作出一些调整才能保证它们在一起工作。
在Java中,使用两种方法来判断对象是否相同:
(1) 对象的ID(是否引用的内存中同一位置的对象,a==b)
(2) 通过实现eauqls方法来判断
在SQL数据库中,数据行的标识是主键。在3.4节中可以看到,无论是==还是equals()都不能表示数据库中的主键。在程序中,几个对象同时对应数据库的某一行是很常见的现象。更进一步说,正确的实现一个持久类的equals()方法并不是一件容易的事情。
我们举例说明关于数据库数据标志的另外一个问题。在USER表的定义中,我们使用USERNAME作为主键。不幸的是,这给修改USERNAME带来了麻烦:我们不仅要修改USER表中的USERNAME,同时也要修改其关联的BILLINGDETAILS的USERNAME。因此,我们推荐使用一个专门的键位。这个专门的键位对于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_TYPE VARCHAR(2) NOT NULL,
USER_ID BIGINT FOREIGN KEY REFERENCES USER,
…
)
USER_ID和BILLING_DETAILS_ID列的值由系统生成,这些列的引入都是为了方便的使用关系模型。怎样才能把它们表现在对象模型中呢?在3.4节,我们来讨论对象/关系映射的解决方案。
在持久化的时候,身份标识和系统的缓存,事务密切相关。不同的持久化方案使用了不同的策略,这就带来许多不便之处。本书中也包含了这样的主题,我们将在第五章了来讨论。
我们所设计和实现的电子商务框架能很好的实现我们所需的功能。我们也找出了对象映射中可能存在的问题包括映射粒度,继承以及对象身份。现在我们已经准备好进行下一步了。但是首先,我们要讨论一下关联的问题,关联指的是我们映射的类和要处理的类之间的关系。在程序中,我们是否需要数据库的外键?

1270

被折叠的 条评论
为什么被折叠?



