-
2004-08-13
今天做了权限管理的测试,发现我的几个错误理解!
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://firebody.blogbus.com/logs/326451.html
一)一对一的理解不是很清楚,现在有必要再分析一下,一对一其实带着很强烈的限制语义,它所表明的意义就是说两个类的对象之间的一一对应。Hibernate有两种实现方式:
1)通过两个类公用一个主键来约定,比如说A的id使用B的id作为它的主键。看看这个例子:
我们必须确保PERSON和EMPLOYEE中相关的字段是相等的。我们使用一个特别的称为foreign的Hibernate标识符生成器策略:
<class name="person" table="PERSON"> <id name="id" column="PERSON_ID"> <generator class="foreign"> <param name="property">employee</param> </generator> </id> ... <one-to-one name="employee" class="Employee" constrained="true"/> </class>一个刚刚保存的Person实例被赋予和该Person的employee属性所指向的Employee实例同样的关键字值。
2)另一种方法是采用一对多的唯一限定来表明这种一一对应关心。看这个例子:
另一种方式是一个外键和一个惟一关键字对应,上面的Employee和Person的例子,如果使这种关联方式,应该表达成:
<many-to-one name="person" class="Person" column="PERSON_ID" unique="true"/>
如果在Person的映射加入下面几句,这种关联就是双向的:
<one-to-one name"employee" class="Employee" property-ref="person"/>
二)cascade在一对多或者多对多的关联中非常重要。父子关系的级联自然好理解,
但是并不是所有的一对多或者多对多关系都是父子关系。如果不是父子关系慎用cascade=all
三)单向一对多是不完整的语义。举例子:
A.getB(), B没用对A进行关联。这种对象关系在现实世界是存在的。为了表示这种单向的关联,我只能在Hibernate这样定义:
<many-to-one name="b"
class="B"
` />
在B的映射文件中,对这个关系不进行描述。
看看这段代码:
a.set(b);
dao.save(a);
dao.delete(b);
dao.load(a);---->error 当装载b时出现null
结果出现错误,按照对象的意义来说,B被删除了,那么a对b的关联就已经失去意义了,A中的b应该相应被只为空。
此时,我们可以这样做:
在B中定义一对多的关系,inverse=false cascade="none" 基本就可以了。
很显然,为了将对象的关系逻辑表示完整,必须采用双向的关系,在各自的映射中定义这种逻辑。单向关系,在删除数据的时候尤其危险。
四)多对多的误解。
多对多可以单向吗?当然可以,而且在hibernate中运行测试一切通过。
然而这种单向关系同样是不完整的,因为关系的维护只能从一边来维护,当我们删除另一边的对象时,
多对多的关联表仍然反映这种关联,很显然这是不正常的,既然对象已经被删除了,那么这个关联也应该随之删除。
而且,当这个逻辑错误的关联存在的话,会给埋下祸害。
多对多慎用cacade=all:从多对多关系来看,很显然两个对象的依赖性并不是很强,可以说这两个类
是松散关联在一起的。那么级联删除就显得毫无意义了。
多对多一边设置inverse=true,另一边设置inverse=false:这种逻辑是很错误的,虽然两端都
设立inverse=false会导致两边同时维护关联表的冲突,但是这种两边都需要维护关联表恰恰是
多对多的一个特征。难不成你删除了一个对象,还可以在关联表中看到这个对象的关联记录
就很正常了?所以,多对多应该在两边都设立Inverse=false。因为两边都有维护关联的责任,
有可能在级联保存的时候出现重复关联记录,那么我们可以采用如下方式避免:
1)casace="none" --这也是多对多推荐使用的设置。符合多对多关联的语义
2)cascade="save-update" 请注意集合的增删减。我们可以通过一些编码技巧来避免重复关联。
3)cascade="all“ 这种设置不能出现在多对多关联中。
结论:
无论什么关系,保持语义完整以及关系完整,都是很重要的。从这个意义来说,单向的关系慎用,甚至不用。
双向包含单向,那我就暂且全部使用双向关系吧。哈哈
随机文章:
这些天开发一卡通系统接口的心得! 2004-09-19最近项目时间很紧张! 2004-09-09java中执行程序的例子 2004-08-28中文编码以及跨平台问题远远超出我的想象! 2004-08-22PicoContainer值得一看!IoC的经典实现! 2004-08-21
收藏到:Del.icio.us








评论