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.冯诺依曼体系结构 冯诺依曼体系的工作原理: 为…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...
[拓扑优化] 1.概述
常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...
Cursor AI 账号纯净度维护与高效注册指南
Cursor AI 账号纯净度维护与高效注册指南:解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后,许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...
