• 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实例被赋予和该Personemployee属性所指向的Employee实例同样的关键字值。

    2)另一种方法是采用一对多的唯一限定来表明这种一一对应关心。看这个例子:

    另一种方式是一个外键和一个惟一关键字对应,上面的EmployeePerson的例子,如果使这种关联方式,应该表达成:

    <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“ 这种设置不能出现在多对多关联中。
     
    结论:
    无论什么关系,保持语义完整以及关系完整,都是很重要的。从这个意义来说,单向的关系慎用,甚至不用。
    双向包含单向,那我就暂且全部使用双向关系吧。哈哈
     

    收藏到:Del.icio.us




    评论

  • 这个多对多的hibernate映射关系增珊该都应该怎么做啊,我非常的不明白