天天看點

Herbernate------關聯映射

映射:基本映射是對一個實體進行映射,關聯映射就是處理多個實體之間的關系,将關聯關系映射到資料庫中,所謂的關聯關系在對象模型中有一個或多個引用。資料庫表之間的關系,在建立表時,可以不指定,在Hibernate映射檔案中指定  。

一對一:一張A表中的一條記錄與另一張B表的一條記錄關聯(字段一樣),并且B表中關聯的那個字段(外鍵)受到A表主鍵的影響(删除、更新,建立)

實作方式:類(持久化類),映射檔案,配置檔案

單向:唯一外鍵關聯(建議使用)、主鍵關聯

持久化類:

public class User  implements java.io.Serializable { 

     private Integer userid;

     private String username;

    //多對一單向就沒有

     private Card card;//一對一

    private Set  card;//一對多或者多對一

}

public class Card  implements java.io.Serializable {

     private Integer cardid;

     private Integer cardnum;   

   //單向就沒有其他對象的引用 

     private User user;//一對一雙向 或者一對多雙向

     prvate  Set user;//多對多雙向

}

操作類

public class HibernateUtil{

        public static final SessionFactory sessionFactory;

         static {

             try{

                sessionFactory=new Configuration().configure.buildSessionFactory();

                 }catch(Throwable ex){

            }

 }

     public static final ThreadLocal session=new ThreadLocal();

     public Staic  Session currenSession()throws HibernateException{

              Session s=(Session)session.get();

              if(s==null){

                s=sessionFactory.openSession();

                session.set(s);

          }

                 return s;

         }

     public static void closeSession()throws HibernateException{

             Session s=(Session)session.get();

             if(s!=null){

              s.close();

           session.set(null);

         }

     }

    public class Test{

    public static void main(String args[]){

          Session session=Hibernate.currenSession();

           Transaction tx=session.beginTransaction();

               //增删改查

         tx.commit();

         session.close;

         }??

一對一映射檔案

主鍵關聯

<hibernate-mapping>

<class name="Person"  table="person">

         <id name="id" column="personId">

                <gernerator class="native"/>

         </id>

</class>

<class name="Address" table="address">

         <id name="id" column="addressId">

                <gernerator class="foreign">

                   <param name="property">person</param>

                 </gernerator>

         </id>   

         <one-to-one name="person" constrained="true"/>   //constrained表示主鍵的值改變會影響外鍵

</class>??

</hibernate-mapping>

唯一外鍵關聯

<class name="Person">

         <id name="id" column="personId">

                <gernerator class="native"/>

         </id>

         <many-to-one name="address"

                column="addressId"

                unique="true"

                not-null="true"/>

</class>

<class name="Address">

         <id name="id" column="addressId">

                <gernerator class="native"/>

         </id>        

</class>??

配置檔案

hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC  

    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  

    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  

<hibernate-configuration>  

    <session-factory>  

        <!-- 設定資料庫驅動 -->  

        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  

        <!-- 設定資料庫URL -->  

        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>  

        <!-- 資料庫使用者名 -->  

        <property name="hibernate.connection.username">root</property>  

        <!-- 資料庫密碼 -->  

       <property name="show_sql">true</property>//是否顯示SQL

      <property name="format_sql">false</property>//是否格式化sql

      <property name="hibernate.hbm2ddl.auto">update</property>

 <!--create: 先删表,再建表。

 create-drop: 啟動時建表,退出前删表。

 update: 如果表結構不一緻,就建立或更新。

 validate: 啟動時驗證表結構,如果不緻就抛異常-->

        <property name="hibernate.connection.password">123456</property>  

        <!-- 指定對應資料庫的方言,hibernate為了更好适配各種關系資料庫,針對每種資料庫都指定了一個方言dialect -->  

        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>        

        <!-- 映射檔案 -->  

        <mapping resource="com/liang/hibernate/User.hbm.xml"/>

一對多:一張A表中的一條記錄與另一張B表的多條記錄關聯

多對一:一張A表中的多條條記錄與另一張B表的一條記錄關聯

多對多“:一張A表中的多條條記錄與另一張B表的多條記錄關聯

注意:多對多關聯不管單向還是雙向都隻能使用連接配接表(建立第三個表),容易造成資料備援。其他一對一、多對一、一對多都可以選擇是否使用單向或者雙向連接配接表。

映射檔案解釋:

1

<?xml version="1.0"?> 

     <!DOCTYPE hibernate-mapping PUBLIC 

        "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 

        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">  

     <!-- 映射檔案開始 -->    

     <hibernate-mapping> 

     <!-- 下面的class節點定義了Province類和對應資料庫表之間的關聯關系 --> 

     <class name="com.xxx.hibernate.Province" table="Province" >  

     <!-- 下面的兩個節點定義了Province類中的屬性和該類對應資料庫表中的字段之間的關聯關系,其中Guid為對應資料庫表的主鍵 --> 

     <id name="guid" type="int"  column="Guid">                      

         <generator class="native" /> //主鍵外鍵

     </id> 

     <property 

        name="provincename" 

        type="java.lang.String" //對象屬性映射關系字段

        column="Provincename" 

        not-null="true" 

        length="16">         

     </property> 

     <!-- 下面的set節點定義了Province類和City類之間的”一對多“型關聯關系 --> 

     <set 

        table="" 連接配接表

        name="cities"<!-- 集合屬性的名稱 --> 

        lazy="true"<!-- 是否允許延遲加載 --> 

        inverse="true"<!-- 定義這個集合是否為雙向關聯關系中的方向一端 如果教給對方,對方對外鍵所做的修改就不影響對方的主鍵 --> 

        cascade="delete"<!-- 定義有關操作是否關聯到子實體(此處指City類對象) --> 

     > 

     <key> 

        <column name="ProvinceID" /><!-- 是Province表主鍵,是city外鍵--> 

     </key> 

     <one-to-many 

        class="City"<!-- 定義集合所屬的類--> 

     /> 

     </set>  

     </class> 

     </hibernate-mapping> 

2

<?xml version="1.0"?> 

     <!DOCTYPE hibernate-mapping PUBLIC 

        "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 

        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" 

     >  

     <!-- 映射檔案開始 -->   

     <hibernate-mapping> 

     <!-- 下面的class節點定義了City類和對應資料庫表之間的關聯關系 --> 

     <class 

        name="com.xxx.hibernate.City" 

        table="City" 

     >  

     <!-- 下面的兩個節點定義了City類中的屬性和該類對應資料庫表中的字段之間的關聯關系,其中Guid為對應資料庫表的主鍵--> 

     <id 

        name="guid" 

        type="int" 

        column="Guid" 

     > 

     <generator class="native" /> 

     </id>   

     <property 

        name="cityname" 

        type="java.lang.String" 

        column="Cityname" 

        not-null="true" 

        length="32" 

     >    

     </property> 

     <!-- 下面的many-to-one節點定義了Province類和City類之間的”一對多“型關聯關系 --> 

     <many-to-one 

        name="province"<!-- 屬性名稱 --> 

        class="com.xxx.hibernate.Province"<!-- 屬性所屬的類 --> 

        cascade="none"<!-- 指定哪些操作會從父對象(此處指City類對象)級聯到子對象(此處指Province類對象) --> 

        outer-join="auto"<!-- 設定父子對象之間是否存在外連接配接 --> 

        not-null="true"<!-- 指定該屬性是否一定為非空 --> 

     > 

     <column name="ProvinceID" /><!-- 定義父對象(此處指City類對象)所對應的資料庫表的外鍵 --> 

     </many-to-one> 

     </class>  

     </hibernate-mapping> 

注意: inverse隻能設定一個

采用資料庫中建立表

create table Person(personId  bigint not null primary)

create table PersonAddress(personId bigint not null,addrssId bigint not null,primary key(personId,addressId)

create table Address(addressId bigint not null primary key)

繼續閱讀