SSH——Hibernate初学者之旅(二)

      上次我们大致介绍了一下hibernate的概念、作用等,知道了hibernate是一种持久化的ORM框架,那么在实际使用中我们是怎么来实现映射关系的呢,我们先一起来看看一对一关联的映射关系。

一、实体

      一个人对应一个地址。

//人
public class Person11fk {
    private int personid;
    private String name;
    private int age;
    private Address11fk address11fk;
//地址
public class Address11fk {
    private int addressid;
    private String addressdetail;

二、主键–关联映射法

1、单向

<hibernate-mapping>
    <class name="com.lavasoft.dx._1_1_pk.Person11pk" table="PERSON_11pk">
        <id name="personid" column="presonid">
            <!--基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键-->
            <generator class="foreign">
                <!--关联持久化类的属性名-->
                <param name="property">address11pk</param>
            </generator>
        </id>
        <property name="name"/>
        <property name="age"/>
        <!--用于映射1-1关联-->
        <one-to-one name="address11pk" constrained="true"/>
    </class>
</hibernate-mapping>
<hibernate-mapping>
    <class name="com.lavasoft.dx._1_1_pk.Address11pk" table="ADDRESS_11pk">
        <id name="addressid">
            <generator class="identity"/>
        </id>
        <property name="addressdetail"/>
    </class>
</hibernate-mapping>

      解说1: foreign :使用另外一个相关联的对象的标识符。为了确保两个对象的主键值相等。
      解说2: one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=true,hibernate即会延迟加载sql,只把主表的查出来,等有用到关联表的再发sql取。

2、双向

<hibernate-mapping> 
        <class name="com.lavasoft.dx._1_1_fk.Person11fk" table="PERSON_11fk"> 
                <id name="personid" column name="id"> 
                        <generator class="identity"/> 
                </id> 
                <property name="name"/> 
                <property name="age"/> 
                <!-- cascade="all":在保存person对象的时候,级联保存person对象关联的address对象 --> 
                <one-to-one name="address11pk" cascade="all" /> 
        </class> 
</hibernate-mapping>
<hibernate-mapping> 
   <class name="com.lavasoft.dx._1_1_fk.Address11fk" table="ADDRESS_11fk"> 
        <id name="addressid" column name="id">
            <!--基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键-->
            <generator class="foreign">
                <!--关联持久化类的属性名-->
                <param name="property">address11pk</param>
            </generator>
        </id>
        <property name="addressdetail"/> 
        <!-- 表示在address表存在一个外键约束,外键参考相关联的表person --> 
        <one-to-one name="person11fk" constrained="true" /> 
   </class> 
</hibernate-mapping>

      解说1: cascade属性的可能值有
      all: 所有情况下均进行关联操作,即save-update和delete。
      none: 所有情况下均不进行关联操作。这是默认值。
      save-update: 在执行save/update/saveOrUpdate时进行关联操作。
      delete: 在执行delete 时进行关联操作。
      all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。
      解说2: constrained=true,hibernate即会延迟加载sql,one-to-one的双向关联中,必须设置constrained=true,要不然会有重复数据读。

三、外键–关联映射法

1、单向

<hibernate-mapping> 
        <class name="com.lavasoft.dx._1_1_fk.Person11fk" table="PERSON_11fk"> 
                <id name="personid"> 
                        <generator class="identity"/> 
                </id> 
                <property name="name"/> 
                <property name="age"/> 
                <!--用来映射关联PO column是Address在该表中的外键列名,增加unique变成“1-1”--> 
                <many-to-one name="address11fk" column="addressId" unique="true"/> 
        </class> 
</hibernate-mapping>
<hibernate-mapping> 
        <class name="com.lavasoft.dx._1_1_fk.Address11fk" table="ADDRESS_11fk"> 
                <id name="addressid"> 
                        <generator class="identity"/> 
                </id> 
                <property name="addressdetail"/> 
        </class> 
</hibernate-mapping>

      解说1:事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似。只需要将原来的many-to-one元素增加unique=”true”属性,用于表示N的一端也必须是唯一的,在N的一端增加了唯一的约束,即成为单向1-1。

2、双向

<hibernate-mapping> 
        <class name="com.lavasoft.dx._1_1_fk.Person11fk" table="PERSON_11fk"> 
                <id name="personid"> 
                        <generator class="identity"/> 
                </id> 
                <property name="name"/> 
                <property name="age"/> 
                <!--用来映射关联PO column是Address在该表中的外键列名,增加unique变成“1-1”--> 
                <many-to-one name="address11fk" column="addressId" unique="true"/> 
        </class> 
</hibernate-mapping>
<hibernate-mapping> 
        <class name="com.lavasoft.dx._1_1_fk.Address11fk" table="ADDRESS_11fk"> 
             <id name="addressid"> 
                     <generator class="identity"/> 
             </id> 
             <property name="addressdetail"/> 
             <!-- 必须制定property-ref为关系字段的名称 -->
             <one-to-one name="person11fk" property-ref="address11fk"></one-to-one>
        </class> 
</hibernate-mapping>

      解说1: property-ref: 在关联对象中用于与本对象关联的属性。

四、连接表–关联映射法

1、单向

<hibernate-mapping>
    <class name="com.lavasoft.dx._1_1_tab.Person11tab" table="PERSON_11tab">
        <id name="personid">
            <generator class="identity"/>
        </id>
        <property name="name"/>
        <property name="age"/>
        <!--使用join元素显式确定链接表-->
        <join table="join_11tab">
            <key column="personid"/>
            <!--映射1-1关联属性,其中unique=“true”属性确定为“1-1”-->
            <many-to-one name="address11tab" unique="true"/>
        </join>
    </class>
</hibernate-mapping>
<hibernate-mapping>
    <class name="com.lavasoft.dx._1_1_tab.Address11tab" table="ADDRESS_11tab">
        <id name="addressid">
            <generator class="identity"/>
        </id>
        <property name="addressdetail"/>
    </class>
</hibernate-mapping>

      解说1: unique=true是指这个字段的值在这张表里不能重复,所有记录值都要唯一,就像主键那样

2、双向

<hibernate-mapping>
    <class name="com.lavasoft.dx._1_1_tab.Person11tab" table="PERSON_11tab">
        <id name="personid">
            <generator class="identity"/>
        </id>
        <property name="name"/>
        <property name="age"/>
        <!--使用join元素显式确定链接表-->
        <join table="join_11tab" optional="true">
            <key column="personid" unique="true"/>
            <!--映射1-1关联属性,其中unique=“true”属性确定为“1-1”-->
            <many-to-one name="address11tab" column="addressid" not-null="true" unique="true"/>
        </join>
    </class>
</hibernate-mapping>
<hibernate-mapping>
    <class name="com.lavasoft.dx._1_1_tab.Address11tab" table="ADDRESS_11tab">
        <id name="addressid">
            <generator class="identity"/>
        </id>
        <property name="addressdetail"/>
        <!--使用join元素显式确定链接表-->
        <join table="join_11tab" optional="true">
            <key column="addressid" unique="true"/>
            <!--映射1-1关联属性,其中unique=“true”属性确定为“1-1”-->
            <many-to-one name="person11tab" column="personid" not-null="true" unique="true"/>
        </join>
    </class>
</hibernate-mapping>

总结:

      通过此次学习,我们知道了Hibernate中一对一关系映射的种类以及实现,但是在我们实际开发中最常用的还是一对多关系的处理,下次我们将一起学习Hibernate一对多关系的映射关系。敬请期待。

你可能感兴趣的:(Hibernate,orm,ssh,映射,一对一)