JPA开发(下)一(多)对多的配置与crud操作
- 1 一对多案例(部门与员工)
- 1.1 实体类注解
- 1.2 级联添加、级联更新与级联删除
- 2 多对多案例(学生与教师)
- 2.1 实体类注解
- 2.2 级联添加、级联删除与级联更新
- 3 多表查询
- 资源下载
更多JPA在框架开发
1 一对多案例(部门与员工)
1.1 实体类注解
package edu.kmust.entity;
import java.util.HashSet;
import java.util.Set;import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/*** 部门实体类* @author zhaoyuqiang**/
@Entity
@Table(name="tb_depart")
public class Depart {@Id@Column(name="depart_id")@GeneratedValue(strategy=GenerationType.IDENTITY)private Long departId ;@Column(name="depart_name")private String departName ;/** 一对多的配置 * targetEntity可以省略* mappedBy代表放弃对外键的维护,其值是Staff实体类中的部门属性* cascade : 级联操作* fetch: 查询方式,不写默认延迟加载* lazy: 延迟加载* eager:立即加载*/@OneToMany(targetEntity=Staff.class,mappedBy="depart",cascade=CascadeType.ALL)private Set<Staff> staffs = new HashSet<Staff>();// 此处省略getter和setter方法
}
package edu.kmust.entity;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
/*** 员工实体类* @author zhaoyuqiang**/
@Entity
@Table(name="tb_staff")
public class Staff {@Id@Column(name="staff_id")@GeneratedValue(strategy=GenerationType.IDENTITY)private Long staffId ;@Column(name="staff_name")private String staffName ;/** 多对一的配置* cascade : 级联操作,ALL表示级联添加、级联删除、级联更新等等* fetch: 查询方式 ,不写默认延迟加载* lazy: 延迟加载* eager:立即加载*/@ManyToOne(targetEntity=Depart.class,cascade=CascadeType.ALL,fetch=FetchType.EAGER)/** 维护外键* JoinColumn :添加外键* name : 外键名字* referencedColumnName : 外键关联的表的主键*/@JoinColumn(name="foreign_departId",referencedColumnName="depart_id")private Depart depart ;// 此处省略getter和setter方法}
1.2 级联添加、级联更新与级联删除
级联添加:
Staff staf = new Staff();
staf.setStaffName("于鲲");
Depart dept = new Depart();
dept.setDepartName("220实验室");
staf.setDepart(dept);
dept.getStaffs().add(staf);
em.persist(dept);
级联更新:
/*** 级联更新 * 将某一员工从220实验室移动到110实验室*/
Depart dept = em.find(Depart.class, 1L);
Staff staf = em.find(Staff.class, 3L);
dept.getStaffs().add(staf);
staf.setDepart(dept);
级联删除:(小心,最好不用)
/*** 级联删除* 删除部门的同时,删除该部门下的所有联系人*/
Depart dept = em.find(Depart.class, 3L);
em.remove(dept);
2 多对多案例(学生与教师)
2.1 实体类注解
package edu.kmust.entity;import java.util.HashSet;
import java.util.Set;import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="tb_teacher")
public class Teacher {@Id@Column(name="tea_id")@GenericGenerator(name="uuid",strategy="uuid") @GeneratedValue(generator="uuid")private String teaId ;@Column(name="tea_name")private String teaName ;/** 放弃第三张表的维护* targetEntity : 可以省略* fetch: 查询方式,不写默认延迟加载* lazy: 延迟加载* eager:立即加载*/@ManyToMany(targetEntity=Student.class,mappedBy="teachers",cascade=CascadeType.ALL)private Set<Student> students = new HashSet<Student>();//此处省略getter和setter
}
package edu.kmust.entity;import java.util.HashSet;
import java.util.Set;import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="tb_student")
public class Student {@Id@Column(name="stu_id")@GenericGenerator(name="uuid",strategy="uuid")@GeneratedValue(generator="uuid")private String stuId ;@Column(name="stu_name")private String stuName ;/** 建立多对多的联系* fetch: 查询方式,不写默认延迟加载* lazy: 延迟加载* eager:立即加载*/@ManyToMany(targetEntity=Teacher.class,cascade=CascadeType.ALL)/** 需要维护中间表,需要用JoinTable创建中间表* JoinTable:创建中间表* name:中间表的表名* joinColumns:* name : 当前实体类在中间表中的外键名字* referencedColumnName : 关联的表的主键字段名* inverseJoinColumns: 另一个实体类* name : 另一个实体类在中间表中的外键名字* referencedColumnName : 关联的表的主键字段名*/@JoinTable(name="tb_student_teacher",joinColumns= {@JoinColumn(name="foreign_student_id",referencedColumnName="stu_id")},inverseJoinColumns= {@JoinColumn(name="foreign_teacher_id",referencedColumnName="tea_id")})private Set<Teacher> teachers = new HashSet<Teacher>();//此处省略getter和setter方法
}
2.2 级联添加、级联删除与级联更新
级联添加:
Student stu = new Student();
Student stu1 = new Student();
stu.setStuName("张大科");
stu1.setStuName("赵玉强");
Teacher tea = new Teacher();
Teacher tea1 = new Teacher();
tea1.setTeaName("常璐璐");
tea.setTeaName("钱谦");
stu.getTeachers().add(tea);
stu1.getTeachers().add(tea);
stu1.getTeachers().add(tea1);
tea.getStudents().add(stu1);
tea.getStudents().add(stu);
tea1.getStudents().add(stu1);
em.persist(stu);
级联更新 :类似一对多,不再演示。
级联删除:(绝对禁止使用) , 不再演示。
3 多表查询
/*** 1.对象图导航* 默认是延迟查询* 如果需要更改,需要对应实体类的配置多对一或者一对多或者多对多标签中加入* */
Depart dept = em.find(Depart.class, 1L) ;
Set<Staff> stafList = dept.getStaffs();
for(Staff staf : stafList) {
System.out.println(staf.getStaffName());
其他查询类似一对多,多表中的特殊查询类似Hibernate中的多表查询。不再演示。
资源下载
JPA学习代码下载:
https://download.csdn.net/download/g425680992/10484800
Hibernate学习代码下载:
https://download.csdn.net/download/g425680992/10484797
JPA开发(下)一(多)对多的配置与crud操作相关推荐
- Android Studio开发(四)SQLite数据库的DAO标准CRUD操作模拟微信通讯录
Android Studio开发(四)SQLite数据库的DAO标准CRUD操作模拟微信通讯录 Android Studio开发(四)SQLite数据库的DAO标准CRUD操作模拟微信通讯录 一.任务 ...
- RHEL 4 下 ISCSI Enterprise Target 的常用配置和常用操作
这里都是关于 使用 ISCSI Enterprise Target(简称IET) 的使用说明. 常用操作命令: 查看当前虚拟单元清单. cat /proc/net/iet/volume ...
- EclipseLink+H2 快速搭建JPA开发环境
JPA是Java Persistence API, 是Java提供的持久层开发的统一API.但是JPA只是定义的规范接口,并没有提供具体实现, JPA的具体实现有Hibernate .EclipseL ...
- DARPA宣布未来五年将投资20亿美元开发下一波人工智能技术
来源:国防科技信息网 作者:丁宏 中国船舶工业综合技术经济研究院 美国DARPA近日宣布,计划在未来5年内投资20亿美元用于开发下一波人工智能技术,寻求情境推理能力等技术的突破,使其有能力识别新的场景 ...
- [Linux]在Linux上部署Java开发环境笔记(一)-- 补充:Linux下如何手动设置IP及配置DNS服务
在Linux上部署Java开发环境笔记(一) -- 补充:Linux下如何手动设置IP及配置DNS服务 2010/06/17 有的Linux系统会有网络设置的图形操作界面,比如"红旗Linu ...
- 使用eclipse安装python插件_在windows下用eclipse + pydev插件来配置python的开发环境
在windows下用eclipse + pydev插件来配置python的开发环境 一.安装 python 可以到网上下个Windows版的python,官网为:https://www.python. ...
- 盘点Win前端开发下常用的软件
盘点Win开发下常用的软件(前端) 本人在使用的一些软件 实用工具 Quicker:快捷方式 截图并贴图 长按鼠标右键打开快捷方式 f.lux:护眼 https://justgetflux.com/ ...
- 视频教程-丑小鸭历险记——趣味玩转unity2d游戏开发(下)-Unity3D
丑小鸭历险记--趣味玩转unity2d游戏开发(下) 从业8年以上,学过一点知识,写过一点代码,擅长计算机图形学,擅长unity3d,擅长将抽象的东西讲明白,写看得懂的代码,讲听得懂的课程,不闲聊,不 ...
- 【Java开发语言 00】环境搭建(配置java环境+‘javac’不是内部或外部命令,也不是可运行的程序+安装idea+idea基本用法+新建项目+在新项目的src路径下新建包和类+基础调试+路径)
idea入门 1 idea安装 1.1 官方下载地址 2 Java语言环境的搭建 下载JDK 安装 JDK(安装路径不要有中文或者特殊符号如空格等) 配置环境变量(必须是全英文状态下的字符) clas ...
最新文章
- Win7下U盘安装Ubuntu14.04双系统
- PHP 一键安装扩展的程序-(Windows 系统)
- Eclipse导入项目常见问题----facet版本问题04
- 2020年什么名字最受欢迎?前面“奕辰”你别走
- 【飞秋教程】文字表情图片对话
- 对于公司来说,企业内训是否真的有必要?
- 在Windows上build Spark
- 团队项目改进与详细设计
- (day 44 - 滑动窗口 ) 剑指 Offer 53 - II. 0~n-1中缺失的数字
- java deadlock oracle_【DEADLOCK】Oracle“死锁”模拟
- python基础-craps赌牌游戏
- 电脑正常登录QQ微信,但浏览器无法打开网页,这个你一定要学会!
- Code、 RO-data=、 RW-data、ZI-data、
- 使用POI创建Excel无法打开
- Python爬虫实战使用scrapy与selenium来爬取数据
- asp毕业设计——基于asp+access的网上选题系统设计与实现(毕业论文+程序源码)——网上选题系统
- C语言下划线开头的函数
- 到处都是“公馆”,中国小区命名为何如此“没文化”?
- 巧用第三方快速开发Android App 热门第三方SDK及框架
- 利用轮播图制作简单游戏页面