详解一对一关系映射

        Hibernate其实就是ORM的一种实现方式,其表达的就是实体和关系之间的一种关系。比方说实体之间有几种关系:一对一,多对一,多对多。而在下面要说的就是一对一关系映射,其分两种情况:主键映射和外键映射
1、主键映射:(person的id即是主键,又是IdCard的外键)
           
       
        1Person-IdCard(单向关联,关系在Person
             iIdCard:
                                <hibernate-mapping>
    <class name="com.tgb.hibernate.IdCard" table="t_idCard">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="cardNo" />
    </class>
</hibernate-mapping>
                        ii、Person:
                                    <hibernate-mapping>
    <class name="com.tgb.hibernate.Person" table="t_person">
        <id name="id" type="integer">
            <!-- 采用foreign生成策略,foreign会取得关联对象的标识 -->
            <generator class="foreign" >
                <!-- property指关联对象 -->
                <param name="property">idCard</param>
            </generator>
        </id>
        <property name="name" />
        <!-- 
            one-to-one指示hibernate如何加载其关联对象,默认根据主键加载
            也就是拿到关系字段值,根据对端的主键来加载关联对象
            
            constrained="true"表示,当前主键(Person的主键)还是一个外键
            参照了对端的主键(IdCard的主键),也就是会生成外键约束语句
         -->
        <one-to-one name="idCard" constrained="true" />
    </class>
</hibernate-mapping>
     2Person-IdCard(双向关联,关系在Person),其余关系不变,只需要在IdCard关系端加入person的引用即可:
            <hibernate-mapping>
    <class name="com.tgb.hibernate.IdCard" table="t_idCard">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="cardNo" />
        
        <!-- 关联Person端 -->
        <one-to-one name="person" />
    </class>
</hibernate-mapping>
2、外键映射:就是在person的一端加入idCard的主键作为外键
           
    
          1Person-IdCard(单向关联,many-to-one的特殊形式,关系维护在person端)
            iIdCard

            <hibernate-mapping>

    <class name="com.tgb.hibernate.IdCard" table="t_idCard">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="cardNo" />
    </class>
</hibernate-mapping>
                                    iiPerson
                                                <hibernate-mapping>
    <class name="com.tgb.hibernate.Person" table="t_person">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="name" />
        
        <many-to-one name="idCard" unique="true" />
    </class>
</hibernate-mapping>
      2Person-IdCard(双向关联):其余关系不变,只需在IdCard端添加对Person的关联即可
<hibernate-mapping>
    <class name="com.tgb.hibernate.IdCard" table="t_idCard">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="cardNo" />
        
        <one-to-one name="person" property-ref="idCard" />
    </class>
</hibernate-mapping>  
3、当然有了上面的关系还是不行的,它不会自动映射到数据库中生成我们要的表,所以在此我们还需要一个工具类帮助我们在数据库中生成表,如下:
        public static void main(String[] args) {

        // 默认读取hibernate.cfg.xml文件
        Configuration cfg =new Configuration().configure();
        
        SchemaExport export =new SchemaExport(cfg);
        
        export.create(truetrue);
    }
    
总结:通过配置上面的操作,我们就可以将其导入到数据库中生成表。虽然看着有点麻烦,其实还是很简单的。一对一说完了,结下来就要说多对一了,敬请期待...
        

发布了159 篇原创文章 · 获赞 243 · 访问量 20万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章