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.冯诺依曼体系结构 冯诺依曼体系的工作原理: 为…...
从“中式英语”到地道表达:我用Notion搭建了一个动态写作原则库
从“中式英语”到地道表达:我用Notion搭建了一个动态写作原则库 第一次参加国际学术会议时,我站在海报前手足无措——不是研究内容不够扎实,而是当外国学者用"Your findings are intriguing but the methodology section lacks clarity&…...
2026届学术党必备的六大AI写作方案横评
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek DeepSeek身为先进的大语言模型,能够为学术论文写作给予系统性辅助。研究者理应首…...
2025届毕业生推荐的六大降重复率网站推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 针对用户试图降低文本里人工智能生成内容的可识别度,降AIGC工具发挥作用…...
知网检测AI率90%,我用这个方法两天降到12%
三月底,距离论文提交还有8天,知网AIGC检测报告出来了:AI率90%。 我当时的反应就是愣在那里。90%,这意味着几乎整篇论文都被标红了。后来用两天时间,把AI率降到了12%。今天把这个过程完整记录下来,因为我知…...
ParseDXF 功能说明文档
DXF解析成运动控制指令DEMO源代码,运动控制软件必备模块。 支持比例缩放 支持按图层解析,各图层可按加工速度、加工参数等分开控制,各图层可选择加工或不加工 支持点、直线、圆、圆弧、多段线解析。 暂不支持椭圆、样条曲线、文字、填充内容解…...
样本收集的致命误区:为什么你的AI模型“一上产线就拉胯”?
很多工程师在收集TVA训练集时,喜欢从良品堆里挑50个,再从废品筐里挑50个,觉得凑够100个样本就能让AI“快速学习”了。结果一上线,只要背景稍微有点灰尘,或者螺母有点偏转角度,系统就疯狂误报。这就是典型的…...
新手零门槛入门:在快马平台轻松学会为openclaw切换不同的ai模型
今天想和大家分享一个特别适合AI编程新手的实践项目——在InsCode(快马)平台上为openclaw切换不同的AI模型。作为一个刚接触AI辅助开发的小白,我最初看到"更换模型"这种操作时总觉得很复杂,但实际体验后发现这个平台把整个过程简化得像搭积木一…...
一键生成专业工资条:工资条生成器功能详解
在当今数字化办公的时代,一款好的工具能够让工作效率得到质的提升。 工资条生成器就是这样一款专门为财务人员打造的专业工具,它集成了多项实用功能。 下面,就让我们来详细了解一下这款软件的各项功能特性。 首先要介绍的是软件的核心功能…...
CUTLASS架构解密:大规模矩阵乘法优化的工程实践
CUTLASS架构解密:大规模矩阵乘法优化的工程实践 【免费下载链接】cutlass CUDA Templates and Python DSLs for High-Performance Linear Algebra 项目地址: https://gitcode.com/GitHub_Trending/cu/cutlass 现实挑战:GPU矩阵计算中的性能瓶颈与…...
Vite Plus 迁移记录与踩坑总结
2. 为什么决定迁移到 ViteVite 刚刚发布,MIT 协议,免费且开源。我十分喜欢 Vite 的 API 的设计和兼容性,对于 Tona, Vite 几乎每个版本都有经历,从 Vite 0.8 版本开始使用, 逐步过渡到 Vite 8,每…...
