JPA之实体之间的关系
JPA之实体之间的关系
10.1.1实体类创建
注解的应用
@Table,@Entity
@Id+@GeneratedValue指定主键,@Column
P174 实体类编写规范
@Table(name = "t_user")
@Entity(name = "User")
public class User implements Serializable {@Id@GeneratedValue(strategy =GenerationType.AUTO)
private Integer id;@Column(name = "name",length = 50,unique = false,insertable = true,updatable = true,table = "t_user",nullable = true)
private String name;
+get和setter方法
+有参无参构造
+toSTring方法 }
10.1.2jap的一对一,一对多,多对多用法
详见10.1.3-10.1.9
10.1.3单向一对一
P188 结合课本的单向一对一进行判断
本人理解的单向一对一的关系是。
往person表插入数据或者是删除数据的时候可以对idcard表进行操作。
但是操作idcard表无论如何也得不到person表的任何信息。
案例:person和身份证实体
- 通过用户可以找到身份证
- 通过身份证不能找到用户
- 关键是关系拥有方如何写
Person的代码:
@Table(name = "person")
@Entity(name="Person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "personId")
private Integer personId; @Column(name="personName")
private String personName;
// ================单项一对一==============
@OneToOne(optional = true,cascade = CascadeType.ALL)
@JoinColumn(name = "id_card")
private IdCard idCard;//构造函数+getter+setter+toString
...
}
IdCard的代码:就是编写一个实体类
@Table(name = "idcard")
@Entity(name="IdCard")
public class IdCard {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "cardId")
private Integer cardId; @Column(name="cardName")
private String cardName;
//构造函数+getter+setter
测试代码:
import com.lxz.demo2.entity.IdCard;
import com.lxz.demo2.entity.Person;import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;public class PersonTest {
public static void main(String[] args) {
EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJPA2");
EntityManager em=factory.createEntityManager();
EntityTransaction transaction=em.getTransaction();
transaction.begin();
Person person=new Person(null,"李四");
IdCard idCard=new IdCard(null,"李四身份证号码");
person.setIdCard(idCard);
em.persist(person);
transaction.commit();
}}
效果图:



10.1.4双向一对一
1.双向一对一
本人理解的双向一对一的关系是。
往person表插入数据或者是删除数据的时候可以对idcard表进行操作。
操作idcard表同样也会操作person表。
1.Person表的代码不变
@Table(name = "t_person")
@Entity(name="Person1")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "personId")
private Integer personId; @Column(name="personName")
private String personName;
// ================单项一对一==============
@OneToOne(optional = true,cascade = CascadeType.ALL)
@JoinColumn(name = "card_id")
private IdCard idCard;}
2.IdCard的代码
@Table(name = "t_card")
@Entity(name="IdCard")
public class IdCard {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "cardId")
private Integer cardId; @Column(name="cardName")
private String cardName;
// =============双向一对一===================
// mappedBy必须和前面设置的保持一致,idCard是person的属性,所以person表是关系的维护方
@OneToOne(optional = false,cascade = CascadeType.REFRESH,mappedBy = "idCard")
private Person person;//构造函数+getter+setter
}

测试代码:

public class PersonTest {
public static void main(String[] args) {
EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJPA2");
EntityManager em=factory.createEntityManager();
EntityTransaction transaction=em.getTransaction();
transaction.begin();
TPerson person=new TPerson(null,"王五");
TIdCard idCard=new TIdCard(null,"李四身份证号码");
person.setIdCard(idCard);
idCard.settPerson(person);
em.persist(person);
em.persist(idCard);
transaction.commit();
}} 效果图:



10.1.5单向一对多
3.单向一对多
P193 单向一对多关系
案例:部门和员工的关系就是一对多的关系
- 外键关联
- 中间表
1.采用外键关联的方式
- 创建表
Department表:

Employee表:

- 创建
- 测试:
EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJPA2");
EntityManager em=factory.createEntityManager();
EntityTransaction transaction=em.getTransaction();
transaction.begin();
Department department=new Department(null,"媒体部",null);
Employee employee=new Employee(null,"王五");
Employee employee2=new Employee(null,"赵六");
List<Employee> e=new ArrayList<>();
e.add(employee);
e.add(employee2);
department.setEmployees(e);
em.persist(department);
transaction.commit();



2.基于中间表方式
案例:学生和选课之间的关系是就是单向一对一,一个学生可以选择多门课程可以形成一个中间表(选课信息表)
基于中间表的方式的区别和基于外键的区别在于配置单方(关系拥有方的时候需要配置中间表)
- student类
@Table(name = "student")
@Entity(name = "Student")
public class Student implements Serializable {
@Id
@GeneratedValue
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name; @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinTable(name="sc",
joinColumns={
@JoinColumn(name = "student_id", referencedColumnName = "id")}
,inverseJoinColumns = {
@JoinColumn(name = "course_id", referencedColumnName = "id")
}) List<Course> courses;}
- Course类:
@Entity(name = "Course")
@Table(name = "course")
public class Course {@Id@GeneratedValue@Column(name = "id")
private Integer id;@Column(name = "name")
private String name;}
- 测试类:
EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJPA2");
EntityManager em=factory.createEntityManager();
EntityTransaction transaction=em.getTransaction();
transaction.begin();
Student student=new Student(null,"张三",null);
Course c1=new Course(null,"数据库");
Course c2=new Course(null,"Java");
List<Course> e=new ArrayList<>();
e.add(c1);
e.add(c2);
student.setCourses(e);
em.persist(student);
transaction.commit();




查询测试:
public static void main(String[] args) {
EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJPA2");
EntityManager em=factory.createEntityManager();
Query query=em.createQuery("select student from Student student");
System.out.println(query.getResultList()); }

- 查多端的
public static void main(String[] args) {
EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJPA2");
EntityManager em=factory.createEntityManager();
Query query=em.createQuery("select course from Course course");
System.out.println(query.getResultList()); }

10.1.6单向多对一/
1.单向一对多
10.1.7双向一对多/双向多对一
P193
从一方可以获取多方,从多方可以获取一方
@ManyToOne注解+@OneToMany注解的应用
- Student类:

@Table(name = "student")
@Entity(name = "Student")
public class Student implements Serializable {@Id@GeneratedValue@Column(name = "id")private Integer id;@Column(name = "name")private String name;@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
List<Course> courses;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Course> getCourses() {return courses;}public void setCourses(List<Course> courses) {this.courses = courses;}public Student() {}public Student(Integer id, String name, List<Course> courses) {this.id = id;this.name = name;this.courses = courses;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", courses=" + courses +'}';}
} - Course类
@Entity(name = "Course")
@Table(name = "course")
public class Course {
@Id
@GeneratedValue
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name; @ManyToOne
@JoinTable(name="sc",
joinColumns={
@JoinColumn(name = "course_id", referencedColumnName = "id")}
,inverseJoinColumns = {
@JoinColumn(name = "student_id", referencedColumnName = "id")
})
private Student student;}
10.1.8单向多对多
P196
- Student表
@Entity(name = "Student")
@Table(name = "student")
public class Student {
@Id
@GeneratedValue
private Integer id;
private String name;
@ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinTable(name = "sc")
private Collection<Course> course=new ArrayList();} - course表:
@Entity(name = "theCourse")
@Table(name = "course")
public class Course {
@Id
@GeneratedValue
private Integer id;
private String name;
10.1.9双向多对多
P197
- Student
@Entity(name = "Student")
@Table(name = "student")
public class Student {
@Id
@GeneratedValue
private Integer id;
private String name;
@ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinTable(name = "sc")
private Collection<Course> courses=new ArrayList(); - Course
@Entity(name = "theCourse")
@Table(name = "course")
public class Course {
@Id
@GeneratedValue
private Integer id;
private String name;
@ManyToMany(mappedBy = "courses",cascade = CascadeType.ALL)
private Collection<Student> students; 10.1.10jpa单表的增删改查
- 目录

- 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="MyJPA" transaction-type="RESOURCE_LOCAL">
<class>com.lxz.demo.entity.User</class>
<properties>
<!-- 标准配置方法,适用性高 -->
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=GMT"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="root"/> <!-- hibernate 的配置方法-->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update"/> <!--create,create-drop,update,validate --> </properties>
</persistence-unit>
</persistence>
- 实体类
@Table(name = "t_user")
@Entity(name = "User")
public class User implements Serializable {
@Id
@GeneratedValue(strategy =GenerationType.AUTO)
private Integer id;
@Column(name = "name",length = 50,unique = false,insertable = true,updatable = true,table = "t_user",nullable = true)
private String name; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public User() {
} public User(Integer id, String name) {
this.id = id;
this.name = name;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
} - UserDao类
public class UserDao {
public boolean add(User user){
try {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("MyJPA");
EntityManager em = factory.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
em.persist(user);
transaction.commit();
em.close();
factory.close();return true;}catch (Exception e){
e.printStackTrace();return false;}} public boolean update(User user){
try {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("MyJPA");
EntityManager em = factory.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
em.merge(user);
transaction.commit();
em.close();
factory.close();return true;}catch (Exception e){return false;}}
public boolean delete(Integer id){
try {
EntityManagerFactory factory= Persistence.createEntityManagerFactory("MyJPA");
EntityManager em=factory.createEntityManager();
EntityTransaction transaction=em.getTransaction();
transaction.begin();
User user=new User();
user=em.find(User.class,id);
em.remove(user);
transaction.commit();
em.close();
factory.close();return true;}catch (Exception e){return false;}}
public User findById(Integer id){
EntityManagerFactory factory= Persistence.createEntityManagerFactory("MyJPA");
EntityManager em=factory.createEntityManager();
EntityTransaction transaction=em.getTransaction();
User user=em.find(User.class,id);
em.close();
factory.close();return user;}
public List<User> findAll(){
EntityManagerFactory factory= Persistence.createEntityManagerFactory("MyJPA");
EntityManager em=factory.createEntityManager();
EntityTransaction transaction=em.getTransaction();
Query query =em.createQuery("select user from User user");
List<User> users=query.getResultList();
em.close();
factory.close();return users;}
} - 测试类
public class UserDaoTest {
public static void main(String[] args) {
UserDao userDao=new UserDao();
System.out.println(userDao.add(new User(null,"add")));
System.out.println(userDao.update(new User(2,"update")));
System.out.println(userDao.delete(9));
System.out.println(userDao.findAll());
System.out.println(userDao.findById(2));
}} 相关文章:
JPA之实体之间的关系
JPA之实体之间的关系 10.1.1实体类创建 注解的应用 Table,Entity IdGeneratedValue指定主键,Column P174 实体类编写规范 Table(name "t_user") Entity(name "User") public class User implements Serializable {IdGeneratedVa…...
如何在 C++ 中调用 python 解析器来执行 python 代码(三)?
本文在 C 中调用 multi.py 脚本,并向它传入参数并执行,然后获得返回值并在 C 中打印结果。 目录 如何在 C 中调用 python 解析器来执行 python 代码(一)?如何在 C 中调用 python 解析器来执行 python 代码࿰…...
【Linux】gcc/g++/gdb的使用
🔥🔥 欢迎来到小林的博客!! 🛰️博客主页:✈️小林爱敲代码 🛰️社区 : 进步学堂 🛰️欢迎关注:👍点赞🙌收…...
浅浅谈一谈B树和B+树
目录: 🚀1.B树 🚀2.B树 索引背后的数据结构是啥呢,是B树,是为了数据库索引设计的,我们可以先了解B树,再说B树 1.什么是B树 B树也叫B-树,这里的-不读减,是一个符号 我们已经学过了二叉搜素树,B树其实就是N叉搜素树,二叉搜索树只能在每一个结点放一个…...
Keil新建一个国民32位MCU工程
1.打开Keil软件,点击Project→New uVision→Project 2.将工程保存到自己的工程文件夹,并给项目命名,点击保存 3.选择自己需要开发的芯片,点击OK 4.点击OK 5.出现上图所示,工程已经建好了,点击配置工程。 6.…...
webpack.config.js与package.json文件的配置
path要使用绝对路径,通过每次复制文件位置非常麻烦且容易导致问题 使用node中的 写个包名跟入口名称,其他全部回车 此步完成后,自动生成一个package.json包 licence指的是开源,一般不写 安装文件夹需要的依赖 dirname是node自带…...
超详细Eclipse配置JDK
在此附上Eclipse安装教程 超详细Eclipse安装教程 在此附上JDK1.8安装配置教程 超详细JDK1.8安装与配置 ①打开Eclipse–>点击Window–>点击Preferences ②找到Java–>找到Installed JREs–>点击Add… ③选中Standard VM–>之后点击Next ④点击Directory找…...
成功解决numpy.linalg.LinAlgError: SVD did not converge in Linear Least Squares
成功解决numpy.linalg.LinAlgError: SVD did not converge in Linear Least Squares 目录 解决问题 解决思路 解决方法—四大原因分析 T1、数据本身问题的解决方法...
Allegro如何设置铜皮避让的优先级操作指导
Allegro如何设置铜皮避让的优先级操作指导 在用Allegro进行PCB设计的时候,时常需要使用动态铜皮进行设计,当两块动态铜皮存在交集的时候,避让就会存在一个优先级,如下图 上方的铜皮避让调了下方的铜皮,上方的铜皮被避让了 如何调整让下方的铜皮避让上方的铜皮,如下图 具…...
(Trie Tree)字典树
(Trie Tree)字典树 场景:在n个字符串中查找某个字符串。 暴力匹配,时间复杂度为O(nm),m为字符串平均长度,效率过低。 字典查找单词"fly",首先查找’f’,然后…...
MQTT的学习之Mosquitto集群搭建
文章钢要: 1、进行双服务器搭建 2、进行多服务器搭建 一、Mosquitto的分布式集群部署 如果需要做并发量很大的时候就需要考虑做集群处理,但是我在查找资料的时候发现并不多,所以整理了一下,搭建简单的Mosquitto集群模式。 首…...
TS面向对象
第二章:面向对象 面向对象简而言之就是程序之中所有的操作都需要通过对象来完成。 举例来说: 操作浏览器要使用window对象操作网页要使用document对象操作控制台要使用console对象 一切操作都要通过对象,也就是所谓的面向对象,…...
Python进阶-----高阶函数map() 简介和使用
目录 简介: 编辑 示例: 示例(1):输出map()函数返回值(迭代器)结果 示例(2):与循环对比 示例(3):字符串转列表 示…...
GPU会变得更便宜吗?GPU 定价更新
在英伟达和AMD发布了一段时间的一致显卡之后,事情在二月份已经降温。没有新的GPU可以谈论,没有特别惊人的交易或任何东西,但仍然值得看看市场现在的表现如何,因为它已经稳定下来,以及我们在未来几个月可以期待什么。过…...
IDEA如何创建一个springboot项目
要想进入springboot的殿堂,你的跨进springboot的门槛,下面就是使用IDEA初始话一个简单的springboot项目。 选择Create New Project 选择Spring Initializer——>选择对应的jdk版本——>Default默认在线构建,需要联网噢 选择自己想写…...
Netty核心功能以及线程模型
目录 Netty核心功能以及线程模型 Netty初探 Netty的使用场景: Netty通讯示例 Netty线程模型 Netty模块组件 Netty核心功能以及线程模型 Netty初探 NIO 的类库和 API 繁杂, 使用麻烦: 需要熟练掌握Selector、 ServerSocketChannel、 So…...
【并发编程二十】协程(coroutine)_协程库
【并发编程二十】协程(coroutine)一、线程的缺点二、协程三、优点四、个人理解五、协程库1、window系统2、unix系统(包括linux的各个版本)2.1、makecontext2.2、swapcontext2.3、setcontext3、第三方库3.1、Boost.Coroutine23.2、…...
c语言入门-5-字符串
c语言入门-5-字符串正文1、字符串怎么用方式一方式二2、字符串的长度深度解析1 字符串的特性2 \0 的含义3 ascii码表下一篇正文 1、字符串怎么用 方式一 // 字符串的标准使用方式,用char类型的数组表示字符串 #include<stdio.h> int main() {char arr[] &…...
[Ansible系列]ansible roles
目录 一. Roles简介 二. Roles基本构成 三. Role使用 3.1 playbook中引用roles 3.2 pre_tasks 和 post_tasks 3.3 role的依赖 四. Ansible Galaxy 一. Roles简介 在Ansible中,role是将playbook分割为多个文件的主要机制。它大大简化了复杂playbook…...
冯诺依曼体系结构与操作系统的理解
✅<1>主页:我的代码爱吃辣 📃<2>知识讲解:操作系统 💬<3>前言:今天来介绍一下冯诺依曼体系结构,和操作系统的理解。 目录 1.冯诺依曼体系结构 冯诺依曼体系的工作原理: 为…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
