二、hibernate中關於對象與數據庫中數據的映射關係配置文件的編寫(xx.hbm.xml配置文件的編寫)

hibernate是是對象關聯關係映射的持久層框架,所以需要將對象與數據庫中對應的表進行相關聯,所以需要用到xml配置的文件

 

一、單表:

如下面,就是UserBean這個類和數據庫中對應的表之間進行關聯相關配置

UserBean類:(有如下屬性,並實現了序列化)

private Integer id;
private String loginName;
private String userName;
private String password;	
private Integer age;
private Integer gender;
private Date birthday;
private Date createTime;

 

UserBean.hbm.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<class name="com.ge.hibernatexml.bean.UserBean" table="t_user">
		<id name="id" column="id" type="int">
			<generator class="identity"></generator>

			<!-- identity 數據庫自增長,ID由數據庫自己負責 ID類型:數值型 -->
			<!-- increment 框架負責ID的自增長,先通過Max(id),然後再+1 作爲ID ID類型:數值型 (不推薦使用) -->
			<!-- assigned 程序員自己通過setId()負責ID的生成 ID類型:任意 -->
			<!-- uuid.hex 由框架採用UUID算法得到一個32位不重複的16進制的ID值,ID類型:字符型 (使用最多!!!) -->
			<!-- foreign 表示ID是外來的,一般應用在O2O這種關聯關係中 -->
			<!-- guid 由框架採用類似於UUID算法的GUID,得到一個128位不重複的16進制的ID值,ID類型:字符型 -->
			<!-- native 由數據庫自己去負責ID的生成,框架和程序員都不管 -->

		</id>

		<property name="loginName" column="login_name" type="string"
			length="20"></property>
		<property name="userName" column="user_name" type="string"
			length="20"></property>
		<property name="password" column="user_pwd" type="string"
			length="32"></property>

		<property name="age" column="age" type="int"></property>
		<property name="gender" column="gender" type="int"></property>

		<property name="birthday" column="birthday" type="java.util.Date"></property>
		<property name="createTime" column="create_time" type="java.util.Date"></property>
		
	</class>

</hibernate-mapping>

 

二、多表(單向關聯)

同樣用上面的用戶例子:

UserBean類:(有如下屬性,增加了兩個單向關聯的屬性UserInfoBean、AddressBean類)

private Integer id;
private String loginName;
private String userName;
private String password;
private Integer age;
private Integer gender;
private Date birthday;
private Date createTime;
	
/**
 * 人擁有人員信息,單向關聯
 */
private UserInfoBean userInfo;
/**
 * 人擁有多個地址,單向關聯
 */
private Set<AddressBean> adds;

UserInfoBean類:

private Integer id;
private String idcard;
private String job;

AddressBean類:

private Integer id;
private String address;
private String telphone;

 

同樣的,配置文件如見如下:

UserBean.hbm.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<class name="com.ge.hibernatexml.bean.UserBean" table="t_user">
		<id name="id" column="id" type="int">
			<generator class="identity"></generator>

			<!-- identity 數據庫自增長,ID由數據庫自己負責 ID類型:數值型 -->
			<!-- increment 框架負責ID的自增長,先通過Max(id),然後再+1 作爲ID ID類型:數值型 (不推薦使用) -->
			<!-- assigned 程序員自己通過setId()負責ID的生成 ID類型:任意 -->
			<!-- uuid.hex 由框架採用UUID算法得到一個32位不重複的16進制的ID值,ID類型:字符型 (使用最多!!!) -->
			<!-- foreign 表示ID是外來的,一般應用在O2O這種關聯關係中 -->
			<!-- guid 由框架採用類似於UUID算法的GUID,得到一個128位不重複的16進制的ID值,ID類型:字符型 -->
			<!-- native 由數據庫自己去負責ID的生成,框架和程序員都不管 -->

		</id>

		<property name="loginName" column="login_name" type="string"
			length="20"></property>
		<property name="userName" column="user_name" type="string"
			length="20"></property>
		<property name="password" column="user_pwd" type="string"
			length="32"></property>

		<property name="age" column="age" type="int"></property>
		<property name="gender" column="gender" type="int"></property>

		<property name="birthday" column="birthday" type="java.util.Date"></property>
		<property name="createTime" column="create_time" type="java.util.Date"></property>
		
		
		<!-- 配置單向的人員關聯關係(O2O) -->
		<!-- unique="true" 將many-to-one 修改爲one-to-one -->
		<!-- column="fk_info_id" 關聯外鍵 -->
		
		<!-- fetch="select"
			lazy="proxy" 將即時加載方式,變更爲延遲加載 -->
			
			
		<!-- cascade="" 級聯,概念等同於數據庫的級聯概念
		見附件《cascade的屬性值.png》
		 -->	
			
		<many-to-one 
			name="userInfo" 
			class="com.gezhi.hibernatexml.bean.UserInfoBean"
			unique="true"
			column="fk_info_id"
			fetch="select"
			lazy="proxy"
			cascade="all"
		></many-to-one>
		
		
		<!-- 配置單向O2M -->
		<set name="adds" cascade="all" table="t_address" fetch="select" lazy="true">
			<!-- 配置關聯外鍵 -->
			<key column="fk_user_id"></key>
			<one-to-many class="com.ge.hibernatexml.bean.AddressBean"/>
		</set>		
		
	</class>

</hibernate-mapping>

AddressBean.hbm.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<class name="com.ge.hibernatexml.bean.AddressBean" table="t_address">
		<id name="id" column="id" type="int">
			<generator class="identity"></generator>

			<!-- identity 數據庫自增長,ID由數據庫自己負責 ID類型:數值型 -->
			<!-- increment 框架負責ID的自增長,先通過Max(id),然後再+1 作爲ID ID類型:數值型 (不推薦使用) -->
			<!-- assigned 程序員自己通過setId()負責ID的生成 ID類型:任意 -->
			<!-- uuid.hex 由框架採用UUID算法得到一個32位不重複的16進制的ID值,ID類型:字符型 (使用最多!!!) -->
			<!-- foreign 表示ID是外來的,一般應用在O2O這種關聯關係中 -->
			<!-- guid 由框架採用類似於UUID算法的GUID,得到一個128位不重複的16進制的ID值,ID類型:字符型 -->
			<!-- native 由數據庫自己去負責ID的生成,框架和程序員都不管 -->

		</id>
		<property name="address" column="address" type="string" length="120"></property>
		<property name="telphone" column="telphone" type="string" length="13"></property>
		
	</class>

</hibernate-mapping>

UserInfoBean.hbm.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<class name="com.ge.hibernatexml.bean.UserInfoBean" table="t_user_info">
		<id name="id" column="id" type="int">
			<generator class="identity"></generator>

			<!-- identity 數據庫自增長,ID由數據庫自己負責 ID類型:數值型 -->
			<!-- increment 框架負責ID的自增長,先通過Max(id),然後再+1 作爲ID ID類型:數值型 (不推薦使用) -->
			<!-- assigned 程序員自己通過setId()負責ID的生成 ID類型:任意 -->
			<!-- uuid.hex 由框架採用UUID算法得到一個32位不重複的16進制的ID值,ID類型:字符型 (使用最多!!!) -->
			<!-- foreign 表示ID是外來的,一般應用在O2O這種關聯關係中 -->
			<!-- guid 由框架採用類似於UUID算法的GUID,得到一個128位不重複的16進制的ID值,ID類型:字符型 -->
			<!-- native 由數據庫自己去負責ID的生成,框架和程序員都不管 -->

		</id>
		<property name="idcard" column="idcard" type="string" length="18"></property>
		<property name="job" column="job" type="string" length="20"></property>
		
	</class>

</hibernate-mapping>

 

三、多表(雙向關聯關係、一對多)

這裏我用學生和老師進行舉例,一個老師對應對個學生,一個學生對應一個老師

TeacherBean類:

private Integer id;
private String teacherName;
private Integer age;
	
private Set<StudentBean> stus;

StudentBean類:

private Integer id;
private String stuName;
private Integer age;
	
private TeacherBean teacher;

 

那麼相對應的配置如下:

TeacherBean.hbm.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<class name="com.ge.hibernatexml.bean.TeacherBean" table="t_teacher">
		<id name="id" column="id" type="int">
			<generator class="identity"></generator>
		</id>
		
		<property name="teacherName" column="teacher_name" type="string" length="20"></property>
		
		<property name="age" column="age" type="int"></property>
		
		<!-- 配置雙向的關聯關係(o2m) -->
		<!-- inverse="true" 控制反轉  
		此時的控制反轉,意思是:將關聯關係的維護權,由"1"的一方交給"多"的一方去維護這個關係,"1"的一方就從此就不再
		維護關聯關係
		
		一般來說,在O2M中,關聯關係,一定是在多的一方在進行維護,比如:職員與部門,班級與學生
		 -->
		<set name="stus" table="t_student" cascade="none" fetch="select" lazy="true" inverse="true">
			<!-- 配置關聯鍵 -->
			<key column="fk_teacher_id"></key>
			<one-to-many class="com.ge.hibernatexml.bean.StudentBean"/>
		</set>
		
	</class>

</hibernate-mapping>

StudentBean.hbm.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<class name="com.ge.hibernatexml.bean.StudentBean" table="t_student">
		<id name="id" column="id" type="int">
			<generator class="identity"></generator>
		</id>
		
		<property name="stuName" column="student_name" type="string" length="20"></property>
		
		<property name="age" column="age" type="int"></property>
		
		<!-- 配置雙向的關聯關係(m2o) -->
		<many-to-one name="teacher" class="com.ge.hibernatexml.bean.TeacherBean"
		cascade="save-update" fetch="select" lazy="proxy" column="fk_teacher_id">
		
		
		</many-to-one>
		
		
		
	</class>

</hibernate-mapping>

 

四、多表(雙向關聯關係、一對一關係)

這裏用丈夫和妻子舉例,一個丈夫含有一個妻子,一個妻子含有一個丈夫

HusbandBean類:

private Integer id;
private String husbandName;
private Integer age;
	
private WifeBean wife;

WifeBean類:

private Integer id;
private String wifeName;
private Integer age;
	
private HusbandBean hus;

 

那麼配置文件如下:

HusbandBean.hbm.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<class name="com.ge.hibernatexml.bean.HusbandBean" table="t_hus">
		<id name="id" column="id" type="int">
			<generator class="identity"></generator>
		</id>
		
		<property name="husbandName" column="hus_name" type="string" length="20"></property>
		<property name="age" column="age" type="int"></property>

		<!-- 配置雙向的關聯關係(O2O) -->
		<many-to-one name="wife" class="com.ge.hibernatexml.bean.WifeBean"
			unique="true" column="fk_wife_id" fetch="select" lazy="proxy" cascade="all"
		></many-to-one>
		
		
	</class>

</hibernate-mapping>

WifeBean.hbm.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<class name="com.ge.hibernatexml.bean.WifeBean" table="t_wife">
		<id name="id" column="id" type="int">
			<generator class="identity"></generator>
		</id>

		<property name="wifeName" column="wife_name" type="string" length="20"></property>
		<property name="age" column="age" type="int"></property>
	
		<!-- 配置雙向的關聯關係(O2O) -->
		<!-- property-ref="wife" 表示 WifeBean 中的hus屬性,與HusbandBean 中的wife屬性是有關聯關係-->
		<one-to-one name="hus" class="com.ge.hibernatexml.bean.HusbandBean" 
		fetch="select" cascade="all" property-ref="wife"
		lazy="proxy"></one-to-one>
		
	</class>

</hibernate-mapping>

 

五、多表(雙向關聯關係、多對多關係)

這裏用玩家和遊戲來舉例,一個遊戲可以多個玩家玩,一個玩家可以玩多個遊戲

PlayerBean類:

private Integer id;
private String playerName;
	
private Set<GameBean> games;

GameBean類:

private Integer id;
private String gameName;
private Set<PlayerBean> players;

 

在多對多的關係中一定有一箇中間表來連接多對多關係的兩個表,通過中間表可以查詢到兩個表之間的對應關係

PlayerBean.hbm.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<class name="com.ge.hibernatexml.bean.PlayerBean" table="t_player">
		<id name="id" column="id" type="int">
			<generator class="identity"></generator>
		</id>
		
		<property name="playerName" column="player_name" type="string" length="20"></property>
		
		<!-- 配置雙向多對多(m2m) -->
		<!-- table="t_player_game" 配置維護關係的中間表 -->
		<set name="games" table="t_player_game" fetch="select" lazy="true">
			<key column="fk_player_id"></key>
			<many-to-many class="com.ge.hibernatexml.bean.GameBean" column="fk_game_id"></many-to-many>
		</set>
		
	</class>

</hibernate-mapping>

GameBean.hbm.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<class name="com.ge.hibernatexml.bean.GameBean" table="t_game">
		<id name="id" column="id" type="int">
			<generator class="identity"></generator>
		</id>
		
		<property name="gameName" column="game_name" type="string" length="20"></property>
		
		<!-- 配置雙向多對多(m2m) -->
		<set name="players" table="t_player_game" fetch="select" lazy="true" inverse="true">
			<key column="fk_game_id"></key>
			<many-to-many class="com.ge.hibernatexml.bean.PlayerBean" column="fk_player_id"></many-to-many>
		</set>
		
	</class>

</hibernate-mapping>

 

五、繼承關係(鑑別器)

在我的mybatis文章中關於這些關係已經有了介紹,這裏我用寵物來介紹,寵物中狗和貓

PetBean類:

private Integer id;
private String petName;

DogBean類:(繼承寵物類)

public class DogBean extends PetBean{

     private Integer bone;

}

CatBean類:(繼承寵物類)

public class CatBean extends PetBean{

	private int fish;
}

 

那麼配置文件如下:

PetBean.hbm.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<class name="com.ge.hibernatexml.bean.PetBean" table="t_pet">
		<id name="id" column="id" type="int">
			<generator class="identity"></generator>
		</id>

		<property name="petName" column="pet_name" type="string" length="20"></property>
		
		<!-- 定義鑑別器 -->
		<discriminator column="pet_type" type="string"></discriminator>
		
		<!-- pet_type值爲0就對應DogBean -->	
		<subclass name="com.ge.hibernatexml.bean.DogBean" discriminator-value="0">
			<property name="bone" column="bone" type="int"></property>
		</subclass>
		
		<!-- pet_type值爲1就對應CatBean -->
		<subclass name="com.ge.hibernatexml.bean.CatBean" discriminator-value="1">
			<property name="fish" column="fish" type="int"></property>
		</subclass>
		
	</class>

</hibernate-mapping>

 

 

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