SSH框架之Hibernate(1)——映射关系[通俗易懂]

SSH框架之Hibernate(1)——映射关系

大家好,又见面了,我是全栈君。

  ORM的实现思想就是将关系数据库中表的数据映射成对象。以对象的形式展现,这样开发者就能够把对数据库的操作转化为对这些对象的操作。Hibernate正是实现了这样的思想,达到了方便开发者以面向对象的思想来实现对数据库的操作。       

  Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java)映射文件(*.hbm.xml)数据库配置文件(*.properties/*.cfg.xml)。它们各自的作用例如以下。

  映射类(*.java):它是描写叙述数据库表的结构,表中的字段在类中被描写叙述成属性,将来就能够实现把表中的记录映射成为该类的对象了。

  映射文件(*.hbm.xml):它是指定数据库表和映射类之间的关系。包含映射类和数据库表的相应关系、表字段和类属性类型的相应关系以及表字段和类属性名称的相应关系等。

  数据库配置文件(*.properties/*.cfg.xml):它是指定与数据库连接时须要的连接信息。比方连接哪种数据库、登录数据库的username、登录password以及连接字符串等,另一个重要的内容就是实体映射文件。


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(身份证)。这样的映射有两种策略:

     *主键关联:通过两个实体的主键进行关联。

 
SSH框架之Hibernate(1)——映射关系[通俗易懂]
      

      映射实现:在一端加入<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,这样就限制了多的一端的多重性为一)。也能够用来表示一对一关联关系,事实上它就是多对一的特殊情况。

SSH框架之Hibernate(1)——映射关系[通俗易懂]

      映射实现:在单向一端加入<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、多对一关联:

           

SSH框架之Hibernate(1)——映射关系[通俗易懂]


     映射实现:在多的一端加入<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、一对多关联:

    一对多关联映射和多对一关联映射原理是一致的。都是在多的一端增加一个外键,指向一的一端

SSH框架之Hibernate(1)——映射关系[通俗易懂]

     映射实现:在一的一端加入<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、多对多关联:

  多对多关联映射新添加一张表才完毕基本映射,例如以下图
SSH框架之Hibernate(1)——映射关系[通俗易懂]



      映射实现:在单向多的一端加入<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的映射关系。大同小异。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116163.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java io常用类总结

    java io常用类总结读写数据是java开发过程中经常需要做的,本篇文章将我们平时常用的javaio处理类做个总结,同时给出相关demo。可以看得出来,JAVAIO主要有这四个类InputStream、OutputStream、Reader、Writer来处理,要处理字节流的就用InputStream、OutputStream,要处理字符流,就用Reader、Writer,现实中根据需要,我们选择他们的相关子类进行…

    2022年5月9日
    40
  • GPU服务器的用处是什么?跟普通服务器有什么区别?

    GPU服务器的用处是什么?跟普通服务器有什么区别?

    2022年2月19日
    59
  • springboot整合kafka入门

    springboot整合kafka入门springboot整合kafka入门kafka基本概念本机安装kafka测试安装kafka(mac下)本机测试kafkaspringboot整合kafka(IDEA)测试kafka基本概念producer:生产者,负责发布消息到kafkacluster(kafka集群)中。生产者可以是web前端产生的pageview,或者是服务器日志,系统CPU、memory等。consumer:消费者,每个consumer属于一个特定的consuergroup(可为每个consumer指定group

    2025年6月12日
    4
  • 分布式锁-这一篇全了解(Redis实现分布式锁完美方案)[通俗易懂]

    前言在某些场景中,多个进程必须以互斥的方式独占共享资源,这时用分布式锁是最直接有效的。随着技术快速发展,数据规模增大,分布式系统越来越普及,一个应用往往会部署在多台机器上(多节点),在有些场景中,为了保证数据不重复,要求在同一时刻,同一任务只在一个节点上运行,即保证某一方法同一时刻只能被一个线程执行。在单机环境中,应用是在同一进程下的,只需要保证单进程多线程环境中的线程安全性,通过JAV…

    2022年4月12日
    38
  • Java分布式应用技术架构介绍

    Java分布式应用技术架构介绍分布式架构的演进系统架构演化历程-初始阶段架构初始阶段的小型系统应用程序、数据库、文件等所有的资源都在一台服务器上通俗称为LAMP特征:应用程序、数据库、文件等所有的资源都在一台服务器上。描述:通常服务器操作系统使用linux,应用程序使用PHP开发,然后部署在Apache上,数据库使用Mysql,汇集各种免费开源软件以及一台廉价服务器就可以开始系统

    2022年6月12日
    35
  • linux软链接的创建、删除和更新[通俗易懂]

    linux软链接的创建、删除和更新[通俗易懂]大家都知道,有的时候,我们为了省下空间,都会使用链接的方式来进行引用操作。同样的,在系统级别也有。在Windows系列中,我们称其为快捷方式,在Linux中我们称其为软链接(基本上都差不多了,其中可能有差别,但是那又怎样呢?我们只要实现我们的效果,谁会有精力去管它茴香的茴字有几种写法呢?)。Windows老姑娘的那几个姿势这里就不赘述了,我们今天主要说下Linux中的茴香的茴字怎么写。

    2022年6月12日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号