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>