Java Web之Hibernate的高级应用(数据库实体关联之间的映射规则、实体继承关系映射、Hibernate查询语言)

简介: Java Web之Hibernate的高级应用(数据库实体关联之间的映射规则、实体继承关系映射、Hibernate查询语言)

前言


在正式进入Hibernate的高级应用之前,需要了解声明是数据模型与领域模型,这两个概念将会帮助我们更好的理解实体对象的关联关系映射


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


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


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


提示:以下是本篇文章正文内容,下面案例可供参考


一、实体关联之间的映射


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


1:单向多对一的关联


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

image.png

<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:多对一双向关联


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

1666442133140.jpg

<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:一对一主键关联


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

1666442152843.jpg

<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:一对一外键关联


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

1666442202933.jpg


5:多对多关联


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


image.png

<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:类继承树映射成一张表


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

1666442269989.jpg

<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:每个子类映射成一张表


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

1666442298251.jpg

<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:每个具体类映射成一张表


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

1666442330071.jpg

<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基本一致  此处不再赘述


相关文章
|
2月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
361 1
|
2月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
322 0
|
3月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
483 64
|
3月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
303 1
|
2月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
127 3
|
2月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
3月前
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。
|
2月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
2月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
下一篇
oss云网关配置