SSH框架之Hibernate(1)——映射關係

  ORM的實現思想就是將關係數據庫中表的數據映射成對象,以對象的形式展現,這樣開發人員就可以把對數據庫的操作轉化爲對這些對象的操作。Hibernate正是實現了這種思想,達到了方便開發人員以面向對象的思想來實現對數據庫的操作。       

  Hibernate在實現ORM功能的時候主要用到的文件有:映射類(*.java)映射文件(*.hbm.xml)數據庫配置文件(*.properties/*.cfg.xml),它們各自的作用如下。

  映射類(*.java):它是描述數據庫表的結構,表中的字段在類中被描述成屬性,將來就可以實現把表中的記錄映射成爲該類的對象了。

  映射文件(*.hbm.xml):它是指定數據庫表和映射類之間的關係,包括映射類和數據庫表的對應關係、表字段和類屬性類型的對應關係以及表字段和類屬性名稱的對應關係等。

  數據庫配置文件(*.properties/*.cfg.xml):它是指定與數據庫連接時需要的連接信息,比如連接哪種數據庫、登錄數據庫的用戶名、登錄密碼以及連接字符串等,還有一個重要的內容就是實體映射文件。


hibernate.cfg.xml



<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:8082/hibernate_first</property>
		<property name="hibernate.connection.username">admin123</property>
		<property name="hibernate.connection.password">admin123</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.show_sql">true</property>

		
		<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>


  由於數據庫表中的關係要通過實體關係表現出來,因此,便出現了Hibernate的映射關係,通過這種映射關係,來表現對應數據庫表之間的關係!

映射關係:

  一、單向映射:

   1、一對一關聯:

     兩個對象之間一對的關係,例如:Person(人)-IdCard(身份證),這種映射有兩種策略:

     *主鍵關聯:通過兩個實體的主鍵進行關聯。

 
      

      映射實現:在一端添加<one-to-one />
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Person" table="t_person">
		<id name="id">			
			<generator class="foreign">			
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"/>
		
		<one-to-one name="idCard" constrained="true"/>
	</class>
</hibernate-mapping>


     *唯一外鍵關聯:外鍵關聯,本來是用於多對一的配置,但是加上唯一的限制之後(採用<many-to-one>標籤來映射,指定多的一端unique爲true,這樣就限制了多的一端的多重性爲一),也可以用來表示一對一關聯關係,其實它就是多對一的特殊情況。



      映射實現:在單向一端添加<many-to-one />


<hibernate-mapping>
	<class name="com.bjpowernode.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>


    2、多對一關聯:

           




     映射實現:在多的一端添加<many-to-one />  


<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="group" column="groupid" cascade="save-update"/>
	</class>
</hibernate-mapping>



    3、一對多關聯:

    一對多關聯映射和多對一關聯映射原理是一致的,都是在多的一端加入一個外鍵,指向一的一端



     映射實現:在一的一端添加<one-to-many />


<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Classes" table="t_classes">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="students">			
			 <key column="classesid"/>
			<one-to-many class="com.bjpowernode.hibernate.Student"/>
		</set>
	</class>
</hibernate-mapping>





    4、多對多關聯:

  多對多關聯映射新增加一張表才完成基本映射,如下圖




      映射實現:在單向多的一端添加<many-to-many />標籤



<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="roles" table="t_user_role">
			<key column="user_id"/>
			<many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" />	
		</set>
	</class>
</hibernate-mapping>




  二、雙向映射:

    1、一對一關聯映射

    映射實現:在兩端添加<one-to-one/>標籤


<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
		<one-to-one name="person"/>
	</class>
</hibernate-mapping>

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Person" table="t_person">
		<id name="id">
			<generator class="foreign">
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"/>
		<one-to-one name="idCard" constrained="true"/>
	</class>
</hibernate-mapping>


    2、一對多關聯映射

    映射實現:多的一端添加<many-to-one/>標籤,一的一端添加<one-to-many/>標籤


<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Classes" table="t_classes">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="students" inverse="true">			
			 <key column="classesid"/>
			<one-to-many class="com.bjpowernode.hibernate.Student"/>
		</set>
	</class>
</hibernate-mapping>


<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Student" table="t_student">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="classes" column="classesid"/>
	</class>
</hibernate-mapping>


    3、多對多關聯映射:

    映射實現:兩端都添加<many-to-many/>標籤


<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Role" table="t_role">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="users" table="t_user_role">
			<key column="role_id" not-null="true"/>
			<many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/>
		</set>
	</class>
</hibernate-mapping>


<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.User" table="t_user">
		<id name="id">
		<span style="white-space:pre">	</span><generator class="native"/>
		</id>
		<property name="name"/>
		<set name="roles" table="t_user_role">
			<key column="user_id" not-null="true"/>
			<many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" />	
		</set>
	</class>
</hibernate-mapping>



  二、小結:

    通過Hiberante的映射關係,從而實現了數據庫表中的相對複雜的表關係。

      PS:Hibernate的這幾種映射關係和EJB的映射關係,大同小異。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章