2. Java 的面向对象有继承, 而数据库都是关系数据, 根本没有继承这回事!
这时候可选的策略就很多了, 比如
(1) 把父类和子类分别映射到各自的Table 中, 数据会出现冗余
(2) 把父类的公共属性放到一个Table中, 每个子类都映射到各自的Table中, 但是只存放子类自己的属性。子类和父类的表之间需要关联。
(3) 干脆把父类和子类都映射到同一张Table中, 用一个字段(例如Type)来表明这一行记录是什么类型。
3. 对象的标识问题
Java中使用a==b 或者 a.equals(b) 来进行对象是否相等的判断, 而数据库则是另外一套:使用主键。
4. 对象的关联问题
在Java 中, 一个对象关联到另外一个或者一组对象是在是太常见了, 双向的关联(也就是A 引用B , B反过来也引用了A )也时常出现, 而在数据库中定义关联能用的手段只剩下外键和关联表了。
5. 数据导航
在OOP中, 多个对象组成了一张网, 顺着网络上的路径, 可以轻松的从一个对象到达另外一个对象。 例如: City c = user.getAddress().getCity();
在关系数据库中非得通过SQL查询, 表的连接等方式来实现不可。
6. 对象的状态
在OOP中, 对象无非就是创建出来使用, 如果不用了,就需要回收掉, 但是一旦扯上数据库, 势必要在编程中引入新的状态,例如“已经持久化”
......
(码农翻身注: 本来想讲Hibernate, 但是限于篇幅, 实在是无法展开讲细节, 这几个问题是Hibernate 官网上提到的, 是O/R Maping 的本质问题)
这些细节问题让Java 头大, 他暗自思忖: " 还是别管那些码农的抱怨, 我还是守住JDBC这一亩三分地吧, 这些烦人的O/R Mapping 问题还是让别人去处理好了。 "
O/R Mapping 的具体实现就这么被Java 搁置下了。