JavaEE经典试题(八)Hibernate实体关联映射

来源:互联网 发布:淘宝天猫网店购买 编辑:程序博客网 时间:2024/05/16 18:23

实体关联映射: 

1、一对一映射: 
   主要有两种方式来映射: 
   一、基于外键的映射方式: 
       首先有两张表,例如:TABEL user  AND card;card 表中参照一个user的主键id 
       首先就是要保证这两个类中,必须要分别有各自的一个连接;也就是说在各个类中有另外一个类  

     的一个属性;比如说: 
class User 

   private Card card;//card的一个属性 

class Card 

   private User user;//user的一个属性 

       这个时候配置就是在user的配置文件中; 
       <one-to-one name="card" class="" cascade="save-update" property-ref="user"/> 
           注意这里的property-ref属性:它是指在映射中,user找到card是通过user这样一个属性来  

      找到的,如果不这样设置,那么就会在关联中出现user的id和card的id相关联的情况; 
       而在card的配置文件中; 
       <many-to-one name="user" class="" column="userid" unique="true"> 
           注意这里column指如何找到user呢?是通过在表中的userid来找到的。而这里的unique指的  

        是限制为了一对一 
    二、基于主键的约束 
        这里仍然有两张表,这两张表分别是:user 和 card 而这个时候,在card表中,并没有userid  

      这一列,但是还是有一个参照userid的外键约束,这里的card中的id主要就是参照的是user中的id 
        而上面基本上没有什么改变。只是在配置文件中; 
        在user的配置文件中, 
          <one-to-one name="card" class="" cascade="save-update"/> 
         这里不需要配置property-ref属性 
        在card中 
         <one-to-one name="user" class="" constrainted="true"/> 
         另外在主键中也要改;开始的时 
            <id name="" type=""> 
               <column name=""/> 
               <generator class="native"/> 
            </id> 
         这里应该改为: 
             <id name="" type=""> 
               <column name=""/> 
               <generator class="foreign"> 
                    <param name="property">user</param> 
                </generator> 
            </id> 

2、一对多、多对一、以及双向多对一关联关系; 
    
    首先讨论多对一的单向关联:这里有两张表;分别是email和user表;email为多的一方,而user为一 

   的一方, 
    email:id,emailname,uid; 
    user:  uid, uname 
    有持久化类:User 和 Email 
    这里所谓单向就是说查询email表可以查出这个email是属于谁的,但是只查询user表不知道有多少个 

   email; 
     因此在持久化类中在多的一方,有一个一的一方的对象的属性;而在一的一方没有这方面的信息; 
    所以在配置的时候就只在多的一方(email)中配置 
    <many-to-one name="user" class="" column="uid"/>这样就够了;但是这个时候在持久化的时候需 

   要都调用save方法,这个时候还要加个级联属性:cascade=“all(save-update)”,那么这个时候  

  只需要持久化这个email对象就够了,而不需要持久化user了。同时还有一个属性就是:outer-join    

;这个属性是指在查询的时候是否使用外连接;如果不使用,那么查询的时候就会查询两次; 
    
    另外,再讨论一下一对多的单向关联: 
    从一的一方看,这就是一对多的关系,表同上,只是在持久化中就有点区别了,这里在User中有个包 

    含set集合的属性,而在email中没有任何的设置,先前的user属性也不需要了,因为这是单向的影射 

   ,所以不需要这样的设置。而在映射文件中就只在uses一方设计就好了。 
    <set name="emails" table="email"> 
      <key column="uid"></key>  //这里的key是在email表中参照user表的外键 
      <one-to-many class="Email"> //这里的class肯定是填的是many这一方的类名 
    </set> 
   
    最后再说一下多对一双向关联,只要把两边都加上,能让你找到我,让我找到你的话就可以了。 

3、多对多关联(比较典型的就是权限设计的时候) 
   在做多对多关联映射的时候,都会有一张关联表; 
   第一、单向多对多 
   第二、双向多对多 
   单向多对多跟双向多对多本身没有多大的区别,只是必须有一边来维护他们之间的关系; 
   比如说:有两张表;user 和 power表 
   要建立它们的多对多的影射关系,那么这里必须在数据库中再建立一张表(连接表)user_power 
   那么在持久化类中设置一个属性--set。那么需要在映射文件中配置这个set的映射 
   <set name="" table="关联表名"> 
      <key column=""></key> 
      <many-to-many class="" column=""> 
   </set> 
   下面来解释一下中间属性的作用; 
    A: name:这里就是配置在所在持久化类中的set属性名 
    B:table:这里就是关联表名,因为它们的关系就是靠这张关联表来维护 
    C:column:这里设置的是在关联表中,与持久化类所在表的关联字段 
    D:class:这里的many端,也就是name所对应的类; 
    E:第二个col