hibernate教程_Hibernate多对多教程

hibernate教程

介绍:

在本教程中,我们将学习使用Hibernate @ManyToMany注释定义和使用多对多实体关联。

上下文构建:

为了继续学习本教程,我们假设我们有两个实体– 雇员资格:

多对多

众所周知,一名员工可以拥有多个资格。 此外,可以有N名具有特定资格的员工。 显然,这意味着“ 雇员”和“ 资格”实体共享多对多关系

Maven依赖项:

在我们的POM中,首先确保我们具有必需的依赖项:

<dependencies>...<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.4.0.Final</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.13</version></dependency>...
</dependencies>

我们总是可以在Maven Central中找到最新的可用版本。 另外,本教程使用MySQL数据库。

数据库设置:

为了表示ManyToMany关联,我们至少需要三个数据库表。 因此,假设我们有下面的ERD图表示我们的数据库:

多对多

另外,让我们创建表:

CREATE TABLE employee (emp_id INT(15) NOT NULL AUTO_INCREMENT,first_name VARCHAR(20) DEFAULT NULL,last_name  VARCHAR(20) DEFAULT NULL,PRIMARY KEY (emp_id)
);CREATE TABLE qualification (qualification_id INT(15) NOT NULL AUTO_INCREMENT,title VARCHAR(20) DEFAULT NULL,PRIMARY KEY (qualification_id)
);CREATE TABLE employee_qualification (emp_id INT(15) NOT NULL,qualification_id INT(15) NOT NULL,PRIMARY KEY (emp_id, qualification_id),CONSTRAINT employee_qualification_empIdFk FOREIGN KEY (emp_id) REFERENCES employee(emp_id),CONSTRAINT employee_qualification_qualIdFk FOREIGN KEY (qualification_id) REFERENCES qualification (qualification_id)
);

创建实体:

现在我们已经准备好数据库设置,让我们首先创建模型类– Employee

@Entity
@Table(name = "Employee")
public class Employee { // ...@ManyToMany(cascade = { CascadeType.ALL })@JoinTable(name = "Employee_Qualification", joinColumns = { @JoinColumn(name = "emp_id") }, inverseJoinColumns = { @JoinColumn(name = "qualification_id") })Set<Qualification> qualifications = new HashSet<>();...
}

多对多关联具有两个方面-拥有方和反向/引用方在关系的所有者端指定了到数据库的实际物理映射 。 在这里, Employee是拥有的实体,因此我们使用@JoinTable批注定义了实际的物理数据库映射。 @JoinTable批注定义了employee_qualification连接表

@JoinColumn批注指定将用于联接表的列。 我们还提到了qualification_id是反向联接列。 它仅表示它是指关系的相反方面,即我们的资格等级。

现在让我们定义我们的资格实体类:

@Entity
@Table(name = "Qualification")
public class Qualification {    // ...  @ManyToMany(mappedBy = "qualifications")private Set<Employee> employees = new HashSet<>();...
}

由于Qualification类是关联的引用侧或相反侧,因此我们已使用mappingBy属性引用其所属侧( Employee )。

就像我们看到的一样,我们在两个实体中都使用了@ManyToMany注释。

使用多对多关联:

在我们的main()方法中,我们可以测试上述映射:

//In our MainApp class
public static void main(String[] args) {Session session = null;    try {SessionFactory factory = new Configuration().configure().buildSessionFactory();session = factory.openSession();Transaction tranx = session.beginTransaction();Employee james = new Employee(1001, "James", "Allen");Employee selena = new Employee(1002, "Selena", "Gomez");Set<Employee> employees = new HashSet<>();employees.add(james);employees.add(selena);Qualification masters = new Qualification(8787, "Masters Degree");masters.setEmployees(employees);     session.save(masters);tranx.commit();} catch(Exception e) {e.printStackTrace();}finally {if(session != null)session.close();}}

执行上述代码后,我们的测试数据将被插入到employeequalificationemployee_qualification表中。

结论:

在此迷你教程中,我们研究了如何建立ManyToMany JPA关联。 我们已经在普通的XML配置上使用了JPA批注,因为它们使用起来更方便并且越来越流行。

翻译自: https://www.javacodegeeks.com/2019/04/hibernate-many-many-tutorial.html

hibernate教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python常用命令格式_python常用命令有哪些

原标题&#xff1a;python常用命令有哪些 Python是一种计算机程序设计语言。是一种动态的、面向对象的脚本语言。它包含了许多命令来帮助我们实现各种各有的功能&#xff0c;接下来在文章中为大家分享【推荐课程&#xff1a;Python教程】 &#xff08;1&#xff09;打开csv文件…

java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.LoopTag

开发工具&#xff1a;IntelliJ IDEA for Mac 开发项目&#xff1a;struts2-demo 构建工件&#xff1a;Maven 问题描述&#xff1a;在 jsp 中使用了 jstl 标签 <c:forEach>&#xff0c;浏览器访问 Action 组件提示错误&#xff1a; java.lang.ClassNotFoundException: ja…

latex 多行公式_Markdown中输入多行并列的公式

本篇旨在以两个Markdown文件编辑器-Typora与Visual Code Studio为例&#xff0c; 说明对于多行并列公式不同的处理方式。Latex中输入多行并列公式在latex文件编辑器中使用align环境输入多行并列的公式&#xff0c; 如下例&#xff1a;begin{align} x & v_0costheta t y &am…

java 常规类的可见性_Java 12常规可用性

java 常规类的可见性马克雷因霍尔德&#xff08;Mark Reinhold&#xff09; 今天宣布 &#xff0c;“ Java 12的参考实现JDK 12现在已全面上市。” Reinhold在该公告中指出&#xff0c;“可以从https://jdk.java.net/12获得来自Oracle的GPL许可的OpenJDK构建&#xff0c;并且“…

python支持复数以及相关的运算吗_Python: 复数的数学运算

写的最新的网络认证方案代码遇到了一个难题&#xff0c;唯一的解决办法就是使用复数空间&#xff0c;需要使用复数来执行一些计算操作。 复数可以用使用函数complex(real, imag) 或者是带有后缀j 的浮点数来指定。 比如&#xff1a; >>> a complex(2, 4) >>>…

分页查询的实现(struts2+jsp+jstl+el)

文章目录MySQL的分页查询语句如何设置《上一页》和《下一页》的有效性呢&#xff1f;示例代码MySQL的分页查询语句 使用 MySQL 的分页查询语句 select * from project limit 5,5&#xff0c;打开表 project&#xff0c;获取全部记录&#xff0c;只要第 5 条记录后的 5 条记录&…

junit 测试执行顺序_JUnit 5中的测试执行顺序

junit 测试执行顺序一般实践认为&#xff0c;自动化测试应能够独立运行且无特定顺序&#xff0c;并且测试结果不应依赖于先前测试的结果。 但是在某些情况下&#xff0c;可以证明特定的测试执行顺序是正确的&#xff0c;尤其是在集成或端到端测试中。 默认情况下&#xff0c;在…

python的起源和发展_Python入门第一课——Python的起源、发展与前景!

我们在做任何一件事情之前&#xff0c;我们都会通过各种渠道去搜集事情的信息&#xff0c;了解事情的来龙去脉&#xff0c;学习一门编程语言也是如此&#xff0c;只有知根知底&#xff0c;我们才能有明确的方向和目标&#xff0c;以及底气去完成这件事情&#xff0c;今天我带大…

MySQL分页查询语句

单表分页查询语句&#xff1a; select * from tbl_name limit start_index, rows_per_page&#xff1b;start_index&#xff1a;每页数据的起始行的索引值&#xff0c;行的索引值从 0 开始 rows_per_page&#xff1a;每页显示的行数 page_num&#xff1a;查询的页码 关系式&a…

spring依赖注入_Spring依赖注入

spring依赖注入介绍&#xff1a; 在设计良好的Java应用程序中&#xff0c;这些类应尽可能独立。 这样的设计提高了组件的可重用性。 它还使对各个组件进行单元测试变得更加容易。 依赖注入的概念促进了Java对象之间的松散耦合。 在本教程中&#xff0c;我们将讨论Spring框架中…

excel 时间戳_我没有Excel基础,可以学Power BI吗

当然可以&#xff01;没有Excel基础一样可以熟练掌握Power BI !Excel基础可以略微影响Power BI的上手速度&#xff0c;却不能决定最终对Power BI的运用能力。如果有Excel基础学习Power BI在最初阶段会更快&#xff0c;但经过实践证明&#xff0c;Excel基础对于PBI的学习进度影响…

Windows下查看wifi密码的命令

netsh wlan show profiles namewifi名称 keyclear

lemon geci_创建一个Java :: Geci生成器

lemon geci几天前&#xff0c;我写了有关Java :: Geci架构&#xff0c;代码生成原理以及生成Java源代码的可能不同方式的文章。 在本文中&#xff0c;我将讨论在Java :: Geci中创建生成器有多么简单。 您好&#xff0c;Wold生成器 HelloWorld1 最简单的生成器是Hello, World…

安卓 图像清晰度识别_OCR文字识别的功能及注意事项

首先OCR文字识别是指电子设备检查纸上打印的字符&#xff0c;然后用OCR文字识别技术翻译成计算机文字的过程&#xff1b;就是对文本资料进行扫描&#xff0c;然后对图像文件进行分析处理&#xff0c;获取文字及版面信息的过程。那么在日常生活中有很多公司有文字识别这方面需求…

薪资/薪水/金额的数据类型

MySQL 数据库中&#xff0c;金额字段使用的数据类型和长度建议为&#xff1a;decimal(11,2) 而对应的实体类的成员变量的数据类型建议为&#xff1a;BigDecimal

java中list去除空值_Java –从列表中删除所有空值

java中list去除空值介绍&#xff1a; 在本文中&#xff0c;我们将学习如何使用普通的Java&#xff0c;Java 8 lambda表达式和某些第三方库从Java 列表中删除空值 。 所以&#xff0c;让我们开始吧&#xff01; 从Java中的 让我们探索从Java 列表中删除null的不同方法&#xf…

URI is not registered (Settings | Languages Frameworks | Schemas and DTDs)

参考&#xff1a; https://www.cnblogs.com/ttflove/p/6341469.html https://blog.csdn.net/c_learner_/article/details/107228678

无法识别的属性“targetframework”。请注意属性名称区分大小写。_神奇!你思考过计算机是怎么识别玻璃和透明物体的吗?...

真实场景中的镜面/玻璃检测和语义分割Charmve | English | Chinesehttps://github.com/Charmve/Mirror-Glass-Detection在这个项目中&#xff0c;我正在学习反射镜和玻璃检测/分段技术。镜子是反射表面&#xff0c;可以反射前面的场景&#xff0c;而玻璃是透明表面&#xff0c;…

Java中的out.write()和out.print()的区别

out 就是 PrintWriter 对象。 out.print() 有处理空值&#xff0c;如果传入的字符串为 null&#xff0c;则会转换为"null"字符串&#xff0c;print() 后续还是调用的 write() 方法&#xff0c;write() 传入的字符串不能为空。这个可以通过 PrintWriter 的源码中看到…