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


相关文章
|
8月前
|
人工智能 安全 机器人
无代码革命:10分钟打造企业专属数据库查询AI机器人
随着数字化转型加速,企业对高效智能交互解决方案的需求日益增长。阿里云AppFlow推出的AI助手产品,借助创新网页集成技术,助力企业打造专业数据库查询助手。本文详细介绍通过三步流程将AI助手转化为数据库交互工具的核心优势与操作指南,包括全场景适配、智能渲染引擎及零代码配置等三大技术突破。同时提供Web集成与企业微信集成方案,帮助企业实现便捷部署与安全管理,提升内外部用户体验。
789 12
无代码革命:10分钟打造企业专属数据库查询AI机器人
|
9月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
10月前
|
Cloud Native 关系型数据库 分布式数据库
|
10月前
|
并行计算 关系型数据库 MySQL
如何用 esProc 将数据库表转储提速查询
当数据库查询因数据量大或繁忙变慢时,可借助 esProc 将数据导出为文件进行计算,大幅提升性能。以 MySQL 的 3000 万行订单数据为例,两个典型查询分别耗时 17.69s 和 63.22s。使用 esProc 转储为二进制行存文件 (btx) 或列存文件 (ctx),结合游标过滤与并行计算,性能显著提升。例如,ctx 并行计算将原查询时间缩短至 0.566s,TopN 运算提速达 30 倍。esProc 的简洁语法和高效文件格式,特别适合历史数据的复杂分析场景。
|
7月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
226 2
|
11月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
11月前
|
数据库 Python
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
|
11月前
|
数据库
【YashanDB知识库】数据库用户所拥有的权限查询
【YashanDB知识库】数据库用户所拥有的权限查询
|
11月前
|
存储 运维 监控
百万指标,秒级查询,零宕机——时序数据库 TDengine 在 AIOps 中的硬核实战
本篇文章详细讲述了七云团队在运维平台中如何利用 TDengine 解决海量时序数据存储与查询的实际业务需求。内容涵盖了从数据库选型、方案落地到业务挑战及解决办法的完整过程,特别是分享了升级 TDengine 3.x 时的实战经验,给到有需要的小伙伴参考阅读。
472 1