二、hibernate中关于对象与数据库中数据的映射关系配置文件的编写(xx.hbm.xml配置文件的编写)

版权声明:本篇文章由IT_CREATE整理 https://blog.csdn.net/IT_CREATE/article/details/87370051

hibernate是对象关联关系映射的持久层框架,所以需要将对象与数据库中对应的表进行相关联,所以需要用到xml配置的文件,本次也是介绍这种方式,这种方式的弊端就是配置xml文件过多。

还有一种利用注解的方式:https://blog.csdn.net/IT_CREATE/article/details/87439010

一、单表:

如下面,就是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>

	<!-- name 类名,table 该类与哪个表对应 -->
	<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>

		<!-- name 类属性名,column 对应表的列名,type 类属性的类型 -->
		<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.ge.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>

猜你喜欢

转载自blog.csdn.net/IT_CREATE/article/details/87370051