JavaWeb Hibernate使用全面介绍

 更新时间:2022年10月27日 11:27:20   作者:showswoller  
在正式进入Hibernate的高级应用之前,需要了解声明是数据模型与领域模型,这两个概念将会帮助我们更好的理解实体对象的关联关系映射

前言

以下内容科班同学学过UML和数据库的应该比较熟悉

数据模型:数据模型是对数据库特征的抽象,也就是用户从数据库中看到的模型,例如一张数据表或者用户从数据表中所看到的存储信息,此模型既要面向对象又要面向系统

领域模型:领域模型是对现实世界中的对象的可视化表现,又称为概念模型,领域模型或者分析对象模式,没有所谓唯一正确的领域模型,所有模型都是对我们试图要理解的领域的近似,领域模型主要是在特定群体用于理解和沟通的工具

一、实体关联之间的映射

接下来的内容与数据库中的ER图映射成关系表十分相似

1、单向多对一的关联

两个类映射成表,并且把被关联表的主键作为关联表的外键

<hibernate-mapping>
 <class name="com.mr.product.Product" table="tab_product">
 <id name="id" column="id" type="int">
 <generator class="native"/>
 </id>
<property name="name" type="string" length="45">
 <column name="name"/>
</property>
<property name="price" type="double">
<column name="price"/>
</property>
<many-to-one name="factory" class="com.mr.factory.Factory">
<column name="factoryid"/>
</many-to-one>
</class>
</hibernate-mapping>

2、多对一双向关联

以任一个表的主键作另一个表的外键都可以

<hibernate-mapping>
 <class name="com.mr.product.Product" table="tab_product">
 <id name="id" column="id" type="int">
 <generator class="native"/>
 </id>
<property name="name" type="string" length="45">
 <column name="name"/>
</property>
<set name="products" inverse="true">
<key column="factoryid"/>
</property>
<one-to-many  class="com.mr.product.Product">
</set>
</class>
</hibernate-mapping>

3、一对一主键关联

指的是两个表之间通过主键形成一对一的映射

<hibernate-mapping>
 <class name="com.mr.people.People" table="tab_people">
 <id name="id" column="id" type="int">
 <generator class="native"/>
 </id>
<property name="name" type="string" length="45">
 <column name="name"/>
</property>
 <property name="sex" type="string" length="2">
<column name="sex"/>
 </property>
<property name="age" type="int">
 <column name="age"/>
 </property>
<ont-to-ont name="com.mr.idcard.IDcard"
 cascade="all"/>
 </class>
</hibernate-mapping>

4、一对一外键关联

这个配置比较简单 添加一个新字段即可 此处不再赘述

5、多对多关联

多对多关联比较特殊 需要另外的一张表来保存多对多的映射关系

<hibernate-mapping>
 <class name="com.mr.user.User" table="tab_user">
 <id name="id">
 <generator class="native"/>
 </id>
 <property name="name" not-null="true"/>
<set name="roles" table="tab_mapping">
<key column=""user_id"></key>
<many-to-many class="com.mr.role.Role" column="role_id"/>
</set>
</class>
</hibernate-mapping>

6、级联操作

级联操作指的是当主控方执行对数据表的更改时,关联对象是否进行同步操作,在映射文件中通过对cascade属性的设置决定是否对关联对象采用级联操作

all 所有情况下均采用级联操作

none 默认参数 所有情况下均不采用级联操作

save-update 在执行save-update方法时执行级联操作

delete 在执行delete方法时执行级联操作

二、实体继承关系映射

继承是面向对象的重要特性 在Hibernate中是以面向对象的思想进行持久化操作的,所以在Hibernate中数据表所映射的实体的对象也是可以存在继承关系的 主要有以下三种

1、类继承树映射成一张表

学生和职员共同继承了人的实体对象,也将拥有人的实体的对象的全部属性 可以将这三个类映射到一张表中 添加一个字段来区分同名属性

<hibernate-mapping package="com.mr.person">
 <class name="Person" table="tab_person">
 <id name="id">
 <generator class="native"/>
</id>
<discriminator column="type" type="string"/>
 <property name="name" not-null="true"/>
<property name="age" type="int"/>
perperty name="sex" type="string"/>
<subclass name="Studeng" discrimination-value="学生">
 <property name="school"/>
</subclass>
<subclass name="Staffer" discrimination-value="职员">
<property name="company"/>
</subclass>
</class>
</hibernate-mapping>

2、每个子类映射成一张表

上述的三个类也可以将每个子类映射成一张表 两个子类映射的表都将通过主键关联到超类映射的表,形成一对一的关系

<hibernate-mapping package="com.mr.person">
 <class name="Person" table="tab_person">
 <id name="id">
 <generator class="native"/>
</id>
<discriminator column="type" type="string"/>
 <property name="name" not-null="true"/>
<property name="age" type="int"/>
perperty name="sex" type="string"/>
<joined-subclass name="Student" table="tab_student">
<key column="id"/>
 <property name="school"/>
</joined-subclass>
<joined-subclass name="Staffer" discrimination-value="职员">
<key column="id"/>
</joined-subclass>
</class>
</hibernate-mapping>

3、每个具体类映射成一张表

将 每个具体类映射成一张表 每个子类的映射表中都含有继承的父类属性映射的字段

<hibernate-mapping package="com.mr.person">
 <class name="Person" abstract="true">
 <id name="id">
 <generator class="assigned"/>
</id>
<discriminator column="type" type="string"/>
 <property name="name" not-null="true"/>
<property name="age" type="int"/>
perperty name="sex" type="string"/>
<union-subclass name="Student" table="tab_student">
<key column="id"/>
 <property name="school"/>
</union-subclass>
<union-subclass name="Staffer" discrimination-value="职员">
<key column="id"/>
</union-subclass>
</class>
</hibernate-mapping>

三、Hibernate查询语言

HQL(Hibernate Query Language)是完全面向对象的查询语言,它提供了更加面向对象的封装,它可以理解如多态, 继承和关联的概念 HQL看上去与SQL相似 但它却提供了更加强大的查询功能

HQL是面向对象的查询语言,所以它需要从目标对象中查询信息并返回匹配单个实体或多个实体对象的集合,而SQL语句是从数据库中查找指定信息,返回的单条信息或多条信息的集合

所以HQL区分大小写 语法如下

select "对象.属性名"
from "对象"
where "条件"
group by"对象.属性名" having "分组条件"
order by "对象.属性名"

实体对象查询

from person
最好指定 一个别名 方便其他地方引用
from person per
此时返回的是person对象中的所有数据

查询指定字段数据

select Person(id,name) from Person per

HQL参数绑定机制

参数绑定机制可以使查询语句和参数具体值相互独立,不但可以提高程序开发效率,还可以有效的防止SQL的注入攻击 HQL中有以下两种方法

1:利用顺序占位符?替代具体参数

session=HibernateUtil.getSession();
String sql="from Employee emp where emp.sex=?";
Query q=session.createQuery(hql);
q.setParameter(0,"男");
emplist=q.list();

2:利用占位符:parameter 替代具体参数

session=HibernateUtil.getSession();
String sql="from Employee emp where emp.sex=:sex";
Query q=session.createQuery(hql);
q.setParameter("sex","男");
emplist=q.list();

其余各种查询与SQL基本一致 此处不再赘述

到此这篇关于JavaWeb Hibernate使用全面介绍的文章就介绍到这了,更多相关JavaWeb Hibernate内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot 指标监控actuator的专题

    SpringBoot 指标监控actuator的专题

    未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-11-11
  • 了解JAVA Future类

    了解JAVA Future类

    Future是并发编程中的一种设计模式,Future它代表一个异步计算的结果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面小编和大家来一起学习一下吧
    2019-06-06
  • JavaWeb项目音频资源播放实现方法详解

    JavaWeb项目音频资源播放实现方法详解

    这篇文章主要介绍了JavaWeb项目音频资源播放实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • App登陆java后台处理和用户权限验证

    App登陆java后台处理和用户权限验证

    这篇文章主要为大家详细介绍了App登陆java后台处理和用户权限验证,感兴趣的朋友可以参考一下
    2016-06-06
  • MyBatis-Spring配置的讲解

    MyBatis-Spring配置的讲解

    今天小编就为大家分享一篇关于MyBatis-Spring配置的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 使用@PropertySource读取配置文件通过@Value进行参数注入

    使用@PropertySource读取配置文件通过@Value进行参数注入

    这篇文章主要介绍了使用@PropertySource读取配置文件通过@Value进行参数注入,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • java this super使用方法详解

    java this super使用方法详解

    Java中this、super关键字的用法简单说明:super是Java语言的保留字,用来指向类的超类,本文将详细介绍,需要的朋友可以参考下
    2012-12-12
  • SpringBoot如何指定某些类优先启动

    SpringBoot如何指定某些类优先启动

    这篇文章主要介绍了SpringBoot如何指定某些类优先启动,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 使用Spring Initializr方式如何快速构建Spring Boot项目

    使用Spring Initializr方式如何快速构建Spring Boot项目

    Spring lnitializr是一个Web应用,它提供了一个基本的项目结构,能够帮助我们快速构建一个基础的Spring Boot项目,本文分步骤讲解如何使用Spring Initializr方式构建Spring Boot项目,感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • java 反射机制详解及实例代码

    java 反射机制详解及实例代码

    这篇文章主要介绍了java 反射机制详解及实例代码的相关资料,需要的朋友可以参考下
    2016-11-11

最新评论