本人刚学Hibernate使用的还不是很熟,想问一下大家一对多的两个实体之间应如何配置效率高一点使用方便一点
(两实体都要经常要进行增删改查操作)
例举一些经验之谈为佳

解决方案 »

  1.   

    <set name="streets" table="street" cascade="save-update" inverse="true">         <key>
             <column name="district_id"/>
             </key>
            <one-to-many class="com.accp.entity.Street"/>
            </set>
      

  2.   

    1.明确inverse和cascade的作用
    inverse决定是否把对对象中集合的改动反映到数据库中,所以inverse只对集合起作用,也就是只对one-to-many或many-to-many有效(因为只有这两种关联关系包含集合,而one-to-one和many-to-one只含有关系对方的一个引用)。
    cascade决定是否把对对象的改动反映到数据库中,所以cascade对所有的关联关系都起作用(因为关联关系就是指对象之间的关联关系)。
    2.关于inverse=”true”的使用场合
       前面提到inverse只对one-to-amny和many-to-many起作用。
    a.在one-to-many关联关系中,一端的对象中含有集合(集合中的元素是关系另一端的对象),所以inverse属性是在一端的配置文件中设置的。如果将一端的inverse设为false,表示由一端来维护关系表,即当插入、删除、更新一端对象时,触发对关系表的维护(one-to-many的关系表就是多端对应的表,该表中包含外键);如果将一端的inverse设为true,表示由多端来维护关系表,即当插入、删除、更新多端对象时,触发对关系表的维护。在one-to-many的关系中,最好将inverse设为”true”,由多端来维护数据,可以减少操作,提高效率。
    b.在many-to-many关联关系中,两端对象中都含有集合,所以两端都要设置inverse属性。inverse属性的默认值为false。在多对多关联关系中,关系的两端inverse不能都设为false,即默认的情况是不对的,如果都设为false,在做插入操作时会导致在关系表中插入两次关系。也不能都设为true,如果都设为true,任何操作都不会触发对关系表的操作。
    3.双向one-to-many关联关系中,为什么设置inverse=”true”?
    设置inverse=”true”,表示由多端来维护数据。如果要一方维护关 系,就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。而如果让"多"方面维护关系时就不会有update 操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。显然这样做的话,会减少很多操作,提高了效率。
    注:
          单向one-to-many关联关系中,不可以设置inverse="true",因为被控方的映射文件中没有主控方的信息。
        利用"one-to-many" 和 "many-to-one"实现双向one-to-many关联关系。
    4.操作建议
      一般对many-to-one和many-to-many不设置级联,这要看业务逻辑的需要;对one-to-one和one-to-many设置级联。
      many-to-many关联关系中,一端设置inverse=”false”,另一端设置为inverse=”true”。在one-to-many关联关系中,设置inverse=”true”,由多端来维护关系表。
      

  3.   

    在one-to-many关联关系中,一端的对象中含有集合(集合中的元素是关系另一端的对象),所以inverse属性是在一端的配置文件中设置的。如果将一端的inverse设为false,表示由一端来维护关系表,即当插入、删除、更新一端对象时,触发对关系表的维护(one-to-many的关系表就是多端对应的表,该表中包含外键);如果将一端的inverse设为true,表示由多端来维护关系表,即当插入、删除、更新多端对象时,触发对关系表的维护。在one-to-many的关系中,最好将inverse设为”true”,由多端来维护数据,可以减少操作,提高效率。
    设置inverse=”true”,表示由多端来维护数据。如果要一方维护关 系,就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。而如果让"多"方面维护关系时就不会有update 操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。显然这样做的话,会减少很多操作,提高了效率。