O/R mapping的难点所在:
DB模型中,只存在主外键参照关系,从数量关系上只能反映出一对一和多对一,对于方向来说,也总是从多端指向一端或一端指向一端。即:DB模型实质上只支持单向一对一和单向多对一关系。
而对象模型的数量关系和控制方向却又很多种:一对多,多对一,多对多,方向也有单向和双向之分,同时对象模型还有继承和多态的特性。可以把问题提的细一些具体一些:怎样把存在继承关系的对象保存在表中?或者这样问,怎样在DB表中表示出继承关系?
这种对象模型和关系模型间的不匹配就是对象和关系映射的难点的根源所在。
不管是一对多还是多对一,DB表的定义形式是不变的,都是用主外键关联两个表或者单独建一个连接表,而且只是单向一对一和单向多对一关联。
但对象模型:
1.有主控方和从动方之分:
都是主控方持有从动方的引用:对于单向关系来说,谁持有对方的引用谁就是主控方,从动方不持有主控方的引用;对于双向关系来说,双方都持有对方的引用,这时inverse为false的一方为主控方。
2.不管是单向还是双向,负责维护关联关系的一方为主控方。
3.维护关联关系到底是什么意思:对象实体发生变化时,最终也要在数据库端反映这种变化,(因为数据最终是保存在DB中的)。维护关联关系就是当主控实体变化时,生成相应的sql语句,同步insert或update用来表示和维持这种关系所涉及的表:用主外键表示关联关系时,是两个表,用连接表表示关联关系时,只有一个关联表。
4.主控方对象save时,在DB端,需要在主外键所在的两个表同时插入记录;主控方对象update时,也需要在两个表同时update,以维持二者的关系。
5.从动方对象save或update时,只是单纯维护自己对应的表, 并不负责维护与主控方的关系。即:只更新自己的表。
DB模型中,只存在主外键参照关系,从数量关系上只能反映出一对一和多对一,对于方向来说,也总是从多端指向一端或一端指向一端。即:DB模型实质上只支持单向一对一和单向多对一关系。
而对象模型的数量关系和控制方向却又很多种:一对多,多对一,多对多,方向也有单向和双向之分,同时对象模型还有继承和多态的特性。可以把问题提的细一些具体一些:怎样把存在继承关系的对象保存在表中?或者这样问,怎样在DB表中表示出继承关系?
这种对象模型和关系模型间的不匹配就是对象和关系映射的难点的根源所在。
不管是一对多还是多对一,DB表的定义形式是不变的,都是用主外键关联两个表或者单独建一个连接表,而且只是单向一对一和单向多对一关联。
但对象模型:
1.有主控方和从动方之分:
都是主控方持有从动方的引用:对于单向关系来说,谁持有对方的引用谁就是主控方,从动方不持有主控方的引用;对于双向关系来说,双方都持有对方的引用,这时inverse为false的一方为主控方。
2.不管是单向还是双向,负责维护关联关系的一方为主控方。
3.维护关联关系到底是什么意思:对象实体发生变化时,最终也要在数据库端反映这种变化,(因为数据最终是保存在DB中的)。维护关联关系就是当主控实体变化时,生成相应的sql语句,同步insert或update用来表示和维持这种关系所涉及的表:用主外键表示关联关系时,是两个表,用连接表表示关联关系时,只有一个关联表。
4.主控方对象save时,在DB端,需要在主外键所在的两个表同时插入记录;主控方对象update时,也需要在两个表同时update,以维持二者的关系。
5.从动方对象save或update时,只是单纯维护自己对应的表, 并不负责维护与主控方的关系。即:只更新自己的表。