在Java 对数据库记录对象化映射实现的考虑中,多对多结构一向是一个令人头痛的问题。对于一个单一的表结构来说,包括它的基表和子表,都不难用一个类进行表达,也不难通过反射的办法把一个类通过一个容器实现与数据表行记录的持久性映射。不过,对于一个多对多表就不一样了,CMP如果不是做不到,就是太复杂而且不易变更;BMP也不容易,实际上这意味着在一个类中表达两个实体的关系,而这两个实体又各自可以是一个CMP的实体对象。对多对多的基表结构是常见的,象组 /角色与成员的关系,就是典型的多对多关系,关系数据库最成功的地方,就是可以使用简单到极点的连接条件表达这种逻辑数理关系,这是其他的任何形式的手段都做不到的。

要用一个类表达多对多的结构,就要考实现这样的目的:多对多的任一端主表可以自主的实现添加,这通常没有问题的;但在删除时,就要顺带把连接关系表中记录一同删除;这就难了,因为,除非在某个地方注册,或者让两个这样的实体实现递归链,否则,根本不可能知道有这样的操作出现。添加主表记录不困难,但增减关系表记录就麻烦事大了,首先要了解已经有那几个关系已经建立,然后增添未建立关系的;减去也是一样。而且这样的操作一般情况下都是一批地进行,这也是CMP难以实现的。

如果不使用一个结构反映这种多对多结构,在实际程序中就必须把这种数据管理工作放到业务逻辑层中进行,代码分散在各个模块,这也是令人很不愉快的。考虑象hibernate的处理方式,可以设想如果有一个类结构,不妨定名为multibase,那么它必须选择是作为主表结构还是基表为主结构。在操作上,必须让程序知道它这个多对多对应有那些表和外键字段。这样,这个同时也是主表的实体对象就可以在它这一边实现管理;不过,多对多的另一方的主表操作就无法知晓,除非扩展CMP的管理逻辑;象简单的,在出现数据增减动作时,自动去找一个上下文中的注册表,看看本实体是不是某个multibase的关联部分,如果是,就去完成多对多关系中的一致性维护工作。

这样,就可以避免在业务逻辑中兼顾过分繁杂的数据一致性步骤了。