一对象之间的关系
.依赖
依赖对象通过调用被依赖对象的方法来获得服务一种比较松散的关系并且是短期的我们的过程与对象往往依赖于我们的实体域对象如在struts的action中调用模型层的方法
.关联
它使一个类指到另一个类的属性长期的
.聚合
聚合关系是关联关系的一种是强的关联关系聚合是整体和部分之间的关系
.组合
也叫合成关系组成关系是关联关系的一种是比聚合关系强的关系对象负责代表部分的对象的生命周期
注既然聚合组合关系属于关联关系那么如何区分一般关联关系聚合关系和组合关系呢?
一般关联只要一个对象联系到另外一个对象就形成了关联关系如人和他的猫黑豹乐队和窦唯PC机和显示器
聚合关系一种强关联关系它要求有部分和整体的关系并且没有了整体部分也可以独立存在在上面三个例子中人和它的猫显然没有部分和整体的关系所以只能是一般的关联关系而黑豹乐队和窦唯窦唯等人组成了黑豹乐队即窦唯和黑豹是整体和部分的关系
而窦唯脱离了黑豹(早就离开了)更或者黑豹不存在了那么窦唯仍然可以以音乐人的身份存在(即对象仍然可以独立存在)所以它属于聚合关系组成关系是可以共享的(窦唯也可以加入其他乐队)
组合关系一种更强的整体和部分的关系它并且要求代表整体的对象负责代表部分的对象的生命周期组成关系是不能共享的如PC机和显示器的关系
我觉得如果两个实体是整体和部分的关系那么它们到底是聚合还是组合这取决于你的需求比如说PC机和显示器的关系如果你的系统中显示器脱离了PC机就不存在意义了也可以说所有显示器的访问都是通过PC机进行的那么你可以把关系设定为组合(如你在为一个只买品牌机的代理商作系统你可能是可以这么作的)
如果你的显示器脱离的PC机仍然可以独立存在也就是说在系统中可以直接访问显示器对象那么你可以将关系设为聚合(如你在为一个买散件的代理商作系统你可能是可以这么作的)
.继承
这个我不想多讲了用过面向对象的语言都应该知道
二关系数据库的关系
一对一
一对多
多对一
多对多
三o/r mapping策略
.继承
对于继承关系一般有三种策略
策略继承树的每个类对应一个表
<joinedsubclass >//共享主键
策略继承树的根类对应一个表
<discriminator ><subclass >//需要添加一个识别字段
策略继承树的叶子类对应一个表不支持多态查询
.关联
. 一对一
一半有两种策略
策略唯一的外键
<manytoone>+unique=true (唯一的外键)
<onetoone>
策略共享主键
<onetoone>
<onetoone><constrained=true> //既是主键又是外键
注意生成方式需要用foreign
. 一对多(无需多说)
. 多对一(无需多说)
. 多对多
策略AB表多对多的关系需要引入C表
C表中的所有属性即为主键又为外键分别参照AB两表
C表中不可以有其他属性
策略将多对多拆分成两个一对多
AB对象多对多的关系需要引入C对象使得AB两对象与C对象的关系为一对多对应数据库中AB表多对多的关系需要引入C表AB两表与C表的关系为一对多
C表又自己的主键
C表中又非主键的外键分别参照AB两表
C表中不可以有其他属性
如学生 课程为多对多的关系 那么引入学生选课
注意策略和策略的不同在于策略引入了新的对象而策略没有这是因为这样策略的c表不能又自己的东西而策略有
. 其他
上面说过聚合与组成是关联的一种所以他们也符合以上策略
特别的当用到组合关系的是否我们可用用到hibernate的组件
<component>
由于组件它完全可以满足组成关系的强关联
.依赖
一般不在实体域对象中体现
O/R MAPPING (HIBERNATE)方法小结 (补充内容)
另外我看到了一种键关联的方法感觉很有道理我理解了一下总结如下
.一般关联
这种方法对于一般的关联总是引入c表(另外的一张表)仅仅表示关系
C表的主键有分别指向AB两表(外键)当指向一方的外键unique=true即唯一那么这一方为一反之为多的一方这样就可以形成一般的关联关系但是注意的是c表不映射为对象C表也没有自己的属性
.聚合和组成
当实体A的非主键列中有一个引自实体B的时候这种关系是B聚合A如果这种引用是强制性的则是合成关系否则为聚合关系是否为强制性只需要将引用列设为非空即可
.继承
当实体A的主键引用自实体B的时候(即为外键)那么A继承 B
总结我觉得O/RM的方法有很多我们可以看到按外键的方法思路很清晰但是它在解决一般的关联的时候总是引入另外一张表这样势必影响效率另外既然聚合和组合是关联的一种那么即使是组合关系我也把它看成一般关联也不算错的
关系数据库一开始就不是为了面向对象的语言服务的所以我们在这里映射无论那种方法似乎都不能说是完全的正确无误完成了O/RM所以我觉得一切都要看我们的项目需求因地制宜!