当前位置: 首页 > wzjs >正文

外贸网站推广渠道建设网站需要了解些什么问题

外贸网站推广渠道,建设网站需要了解些什么问题,网站色调为绿色,学校网站建设成功[spring] Spring JPA - Hibernate 多表联查 3 这篇笔记基于: [spring] Spring JPA - Hibernate 多表联查 1[spring] Spring JPA - Hibernate 多表联查 2 进行实现 这是目前对于 Hibernate 学习的最后一步了,主要学习一下 many-to-many 的关系 之前的…

[spring] Spring JPA - Hibernate 多表联查 3

这篇笔记基于:

  • [spring] Spring JPA - Hibernate 多表联查 1
  • [spring] Spring JPA - Hibernate 多表联查 2

进行实现

这是目前对于 Hibernate 学习的最后一步了,主要学习一下 many-to-many 的关系

之前的内容都覆盖的差不多了,整体来说这篇笔记会比较短,也没这么多代码

Many to Many

many-to-many 应该是日常生活中遇到的最多的情况,如 course <-> student,但是在这种情况下,如果需要使用外链去存储对应的关系,那么就会让数据变得非常难以管理,并且搜索的效率也会非常的低下。

目前比较常见的一个处理方法是使用 join table,去单独存储二者之间的 mapping

更新数据库

DROP SCHEMA IF EXISTS `hb-05-many-to-many`;CREATE SCHEMA `hb-05-many-to-many`;use `hb-05-many-to-many`;SET FOREIGN_KEY_CHECKS = 0;CREATE TABLE `instructor_detail` (`id` int NOT NULL AUTO_INCREMENT,`youtube_channel` varchar(128) DEFAULT NULL,`hobby` varchar(45) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;CREATE TABLE `instructor` (`id` int NOT NULL AUTO_INCREMENT,`first_name` varchar(45) DEFAULT NULL,`last_name` varchar(45) DEFAULT NULL,`email` varchar(45) DEFAULT NULL,`instructor_detail_id` int DEFAULT NULL,PRIMARY KEY (`id`),KEY `FK_DETAIL_idx` (`instructor_detail_id`),CONSTRAINT `FK_DETAIL` FOREIGN KEY (`instructor_detail_id`)REFERENCES `instructor_detail` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;CREATE TABLE `course` (`id` int NOT NULL AUTO_INCREMENT,`title` varchar(128) DEFAULT NULL,`instructor_id` int DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `TITLE_UNIQUE` (`title`),KEY `FK_INSTRUCTOR_idx` (`instructor_id`),CONSTRAINT `FK_INSTRUCTOR`FOREIGN KEY (`instructor_id`)REFERENCES `instructor` (`id`)ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;CREATE TABLE `review` (`id` int NOT NULL AUTO_INCREMENT,`comment` varchar(256) DEFAULT NULL,`course_id` int DEFAULT NULL,PRIMARY KEY (`id`),KEY `FK_COURSE_ID_idx` (`course_id`),CONSTRAINT `FK_COURSE`FOREIGN KEY (`course_id`)REFERENCES `course` (`id`)ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;CREATE TABLE `student` (`id` int NOT NULL AUTO_INCREMENT,`first_name` varchar(45) DEFAULT NULL,`last_name` varchar(45) DEFAULT NULL,`email` varchar(45) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;CREATE TABLE `course_student` (`course_id` int NOT NULL,`student_id` int NOT NULL,PRIMARY KEY (`course_id`,`student_id`),KEY `FK_STUDENT_idx` (`student_id`),CONSTRAINT `FK_COURSE_05` FOREIGN KEY (`course_id`)REFERENCES `course` (`id`)ON DELETE NO ACTION ON UPDATE NO ACTION,CONSTRAINT `FK_STUDENT` FOREIGN KEY (`student_id`)REFERENCES `student` (`id`)ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;SET FOREIGN_KEY_CHECKS = 1;

跑完后的结果应该是这样的:

在这里插入图片描述

下面一排和之前的案例是一样的,这里就是新增了两张表格

实现学生实例 & 更新课程实例

简单的代码,写了蛮多遍了:

package com.example.demo.entity;import jakarta.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;@Entity
@Table(name = "student")
@Data
@NoArgsConstructor
public class Student {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id")private int id;@Column(name = "first_name")private String firstName;@Column(name = "last_name")private String lastName;@Column(name = "email")private String email;public Student(String firstName, String lastName, String email) {this.firstName = firstName;this.lastName = lastName;this.email = email;}@Overridepublic String toString() {return "Student{" +"id=" + id +", firstName='" + firstName + '\'' +", lastName='" + lastName + '\'' +", email='" + email + '\'' +'}';}
}

下面是实现 many-to-many 的部分

更新课程 entity 获取学生
    @JoinTable(name = "course_student",joinColumns = @JoinColumn(name = "course_id"),inverseJoinColumns = @JoinColumn(name = "student_id"))private List<Student> students;

这个部分理解起来还是比较简单的:

  • JoinTable - 顾名思义,联表
  • joinColumns - 指的是当前 entity 在表中对应的 id
  • inverseJoinColumns - 目标 entity 的 id
更新学生 entity 获取课程
    @ManyToMany(fetch = FetchType.LAZY,cascade = { CascadeType.PERSIST, CascadeType.DETACH,CascadeType.MERGE, CascadeType.REFRESH })@JoinTable(name = "course_student",joinColumns = @JoinColumn(name = "student_id"),inverseJoinColumns = @JoinColumn(name = "course_id"))private List<Course> courses;

student 和 course 的实现基本是一致的,但是因为 entity 的不同,所以 joinColumnsinverseJoinColumns 所 mapping 的值需要进行对调

更新 main
	private void createCourseAndStudents(AppDAO appDAO) {Course course = new Course("Table Tennis");Student student1 = new Student("John", "Doe", "john_doe@gmail.com");Student student2 = new Student("Mary", "Jane", "m_jane@gmail.com");course.addStudent(student1);course.addStudent(student2);System.out.println("Saving the course: " + course);System.out.println("associated students: " + course.getStudents());appDAO.save(course);}

这个写的应该也是蛮多了,没什么特别大的差异,主要就是跑一下证明一下代码没写错

效果如下:

在这里插入图片描述

寻找上 A 课的学生

这里最关键的是 courseId,找的是所有注册 :course_id 的课

DAOImpl 的实现:

    @Overridepublic Course findCourseAndStudentByCourseId(int id) {TypedQuery<Course> query = entityManager.createQuery("select c from Course c "+ "JOIN FETCH c.students "+ "where c.id = :data",Course.class);query.setParameter("data", id);return query.getSingleResult();}

main 的更新:

	private void findCourseAndStudents(AppDAO appDAO) {int id = 10;Course course = appDAO.findCourseAndStudentByCourseId(id);System.out.println(course);}

效果如下:

在这里插入图片描述

找 B 学生要上的所有课

这里最关键的是 studentId,找的是所有注册 :student_id 的课

DAOImpl 的实现如下:

    @Overridepublic Student findStudentAndCoursesByStudentId(int id) {TypedQuery<Student> query = entityManager.createQuery("select s from Student s "+ "JOIN FETCH s.courses "+ "where s.id = :data",Student.class);query.setParameter("data", id);return query.getSingleResult();}

main 的更新如下:

	private void findStudentAndCourses(AppDAO appDAO) {int id = 1;Student student = appDAO.findStudentAndCoursesByStudentId(id);System.out.println(student);System.out.println(student.getCourses());}

效果截图:

在这里插入图片描述

删除课程

这部分的代码其实没必要变动,一样可以跑:

在这里插入图片描述

主要还是因为 cascade type 里面没有什么 delete 的关系

删除学生

    @Override@Transactionalpublic void deleteStydentById(int id) {Student student = entityManager.find(Student.class, id);if (student != null) {entityManager.remove(student);}}

remove 之前调用一下 clear 也可以手动断开所有的 foreign key 关联。一般来说 map 的比较好的,JPA 可以自动进行清理——也就是 demo app 跑的

但是如果是要用在 production 上的话,还是加一个 student.getCourses().clear(); 比较好


文章转载自:

http://U8GSs3Ng.mdrnn.cn
http://2iSH1zbo.mdrnn.cn
http://yr8WmuYz.mdrnn.cn
http://uZ8dfqJf.mdrnn.cn
http://cD7zEntI.mdrnn.cn
http://t7fVIthH.mdrnn.cn
http://WfKYMwRH.mdrnn.cn
http://PipnbaWt.mdrnn.cn
http://NGWTnxl7.mdrnn.cn
http://xG40Vmk6.mdrnn.cn
http://HJzcDWFb.mdrnn.cn
http://PJxsn2yl.mdrnn.cn
http://EiKPpGDb.mdrnn.cn
http://H1HV2kdO.mdrnn.cn
http://P68N3DWJ.mdrnn.cn
http://PGEEGHHd.mdrnn.cn
http://7JXsi7KE.mdrnn.cn
http://R7YEzbnI.mdrnn.cn
http://FlNzyNbR.mdrnn.cn
http://ruKLCLRf.mdrnn.cn
http://8jbRFZVD.mdrnn.cn
http://3XPZuxn3.mdrnn.cn
http://F8JSISpS.mdrnn.cn
http://7oJc7f0K.mdrnn.cn
http://obu3V8Fl.mdrnn.cn
http://FQnqO9uj.mdrnn.cn
http://YgQkrtr8.mdrnn.cn
http://pFSzHC5p.mdrnn.cn
http://uXPmcQKV.mdrnn.cn
http://6J5P8WfV.mdrnn.cn
http://www.dtcms.com/wzjs/742413.html

相关文章:

  • 网站下载软件入口网站后台乱码怎么办
  • 网站搜索功能设计网站运营招聘要求
  • 昆山张浦做网站wordpress 景点模板
  • 高安市网站建设公司10元云服务器
  • 做网咖的网站app开发制作
  • 网页设计网站模板素材现代企业信息管理系统
  • 卫浴洁具网站模板宣传册设计与制作合同
  • 多语言网站建设费用代理备案网站
  • 北京网站制作公司哪家好中国网新重庆
  • 网站诚信备案网站建设 漳州
  • 网站源码怎么使用宁波建设集团几个分公司
  • 整个网站开发框架流程咸阳网站设计建设公司
  • 试玩网站建设微信朋友圈推广
  • 高端集团官方网站建设公司更改wordpress登陆界面
  • 什么网站是solr做的久久建筑网怎么不好用
  • 网站做好了怎么做后台管理新会住房和城乡建设部网站
  • 网站标准尺寸怎么自己做一个小程序
  • 网站建设的步骤教程视频教程企业服务类型有哪些
  • 网站前台模板 html引流用什么话术更吸引人
  • 广西新农村建设工作专题网站网站数据库地址是什么
  • 福建省住房和城乡建设厅的网站哪些大公司用wordpress
  • 常州市建设局网站6网站首页倒计时功能怎么做
  • 企业网站对网络营销的意义百度搜索收录提交入口
  • 珠海专业医疗网站建设外国设计师素材网站
  • 一诺互联网站建设公司建设招聘网站
  • 宣传册制作网站百度一下电脑版
  • 千图网素材解析网站开发那些做黑网站的都是团体还是个人
  • 自己做的网站服务器开了进不去网站开发框架技术
  • 深圳专业网站设计专业定制乐装网
  • 企业网站设计意义快速开发平台开发