准备
一个班级对应多个学生
多个学生对应一个班级
@OneToMany
CascadeType[] cascade
(可选)必须级联到关联目标的操作。
FetchType fetch
(可选)是否应该延迟加载关联,或者必须急切地获取关联。
java.lang.String mappedBy
拥有关系的字段。
boolean orphanRemoval
(可选)是否将删除操作应用于已从关系中删除的实体,以及是否将删除操作级联到这些实体。
java.lang.Class targetEntity
(可选)作为关联目标的实体类。
@ManyToOne
CascadeType[] cascade
(可选)必须级联到关联目标的操作。
FetchType fetch
(可选)是否应该延迟加载关联,或者必须急切地获取关联。
boolean optional
(可选)关联是否可选。
java.lang.Class targetEntity
(可选)作为关联目标的实体类。
@JoinTable
JoinTable API
java.lang.String catalog
(可选)表的目录。
ForeignKey foreignKey
(可选)当表生成生效时,用于指定或控制与joinColumns元素对应的列的外键约束的生成。
Index[] indexes
(可选)表的索引。
ForeignKey inverseForeignKey
(可选)当表生成生效时,用于指定或控制与inverseJoinColumns元素对应的列的外键约束的生成。
JoinColumn[] inverseJoinColumns
(可选)联接表的外键列,它们引用不拥有关联的实体的主表。
JoinColumn[] joinColumns
(可选)联接表的外键列,它们引用拥有关联的实体的主表。
java.lang.String name
(可选)联接表的名称。
java.lang.String schema
(可选)表的模式。
UniqueConstraint[] uniqueConstraints
(可选)要放在表上的惟一约束。
数据库数据
/*
Navicat Premium Data Transfer
Source Server : 192.168.1.200
Source Server Type : MySQL
Source Server Version : 80013
Source Host : 192.168.1.200:3306
Source Schema : Hibernate
Target Server Type : MySQL
Target Server Version : 80013
File Encoding : 65001
Date: 29/12/2018 15:36:49
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for class
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
`classID` int(11) NOT NULL AUTO_INCREMENT COMMENT '唯一标识',
`className` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '班级名',
PRIMARY KEY (`classID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES (1, '火力班');
INSERT INTO `class` VALUES (2, '志成班');
INSERT INTO `class` VALUES (3, '自强班');
INSERT INTO `class` VALUES (4, '启航班');
-- ----------------------------
-- Table structure for class_student
-- ----------------------------
DROP TABLE IF EXISTS `class_student`;
CREATE TABLE `class_student` (
`studentID` int(11) NULL DEFAULT NULL,
`classID` int(11) NULL DEFAULT NULL,
INDEX `stu_fk`(`studentID`) USING BTREE,
INDEX `cla_fk`(`classID`) USING BTREE,
CONSTRAINT `cla_fk` FOREIGN KEY (`classID`) REFERENCES `class` (`classid`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `stu_fk` FOREIGN KEY (`studentID`) REFERENCES `student` (`studentid`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of class_student
-- ----------------------------
INSERT INTO `class_student` VALUES (1, 1);
INSERT INTO `class_student` VALUES (2, 1);
INSERT INTO `class_student` VALUES (3, 1);
INSERT INTO `class_student` VALUES (4, 1);
INSERT INTO `class_student` VALUES (5, 1);
INSERT INTO `class_student` VALUES (6, 2);
INSERT INTO `class_student` VALUES (7, 2);
INSERT INTO `class_student` VALUES (8, 2);
INSERT INTO `class_student` VALUES (9, 2);
INSERT INTO `class_student` VALUES (10, 2);
INSERT INTO `class_student` VALUES (11, 3);
INSERT INTO `class_student` VALUES (12, 3);
INSERT INTO `class_student` VALUES (13, 3);
INSERT INTO `class_student` VALUES (14, 3);
INSERT INTO `class_student` VALUES (15, 3);
INSERT INTO `class_student` VALUES (16, 4);
INSERT INTO `class_student` VALUES (17, 4);
INSERT INTO `class_student` VALUES (20, 4);
INSERT INTO `class_student` VALUES (18, 4);
INSERT INTO `class_student` VALUES (19, 4);
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`studentID` int(11) NOT NULL AUTO_INCREMENT COMMENT '唯一标识',
`studentName` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '学生名',
PRIMARY KEY (`studentID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '贾德善');
INSERT INTO `student` VALUES (2, '彭万里');
INSERT INTO `student` VALUES (3, '高大山');
INSERT INTO `student` VALUES (4, '谢大海');
INSERT INTO `student` VALUES (5, '马宏宇');
INSERT INTO `student` VALUES (6, '林莽');
INSERT INTO `student` VALUES (7, '黄强辉');
INSERT INTO `student` VALUES (8, '章汉夫');
INSERT INTO `student` VALUES (9, '范长江');
INSERT INTO `student` VALUES (10, '林君雄');
INSERT INTO `student` VALUES (11, '谭平山');
INSERT INTO `student` VALUES (12, '朱希亮');
INSERT INTO `student` VALUES (13, '李四光');
INSERT INTO `student` VALUES (14, '甘铁生');
INSERT INTO `student` VALUES (15, '张伍绍祖');
INSERT INTO `student` VALUES (16, '马继祖');
INSERT INTO `student` VALUES (17, '程孝先');
INSERT INTO `student` VALUES (18, '宗敬先');
INSERT INTO `student` VALUES (19, '年广嗣');
INSERT INTO `student` VALUES (20, '汤绍箕');
INSERT INTO `student` VALUES (21, '吕显祖');
单向一对多
Class
package entity;
import java.util.Set;
import javax.persistence.CascadeType;
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.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Table(name = "class")
@Entity
public class Class {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int classID;
private String className;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "class_student", joinColumns = { @JoinColumn(name = "classID") }, inverseJoinColumns = {
@JoinColumn(name = "studentID") })
private Set<Student> students;
public int getClassID() {
return classID;
}
public void setClassID(int classID) {
this.classID = classID;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
Student
package entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name = "student")
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int studentID;
private String studentName;
public int getStudentID() {
return studentID;
}
public void setStudentID(int studentID) {
this.studentID = studentID;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
}
单向多对一
package entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name = "class")
@Entity
public class Class {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int classID;
private String className;
public int getClassID() {
return classID;
}
public void setClassID(int classID) {
this.classID = classID;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
package entity;
import javax.persistence.CascadeType;
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.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Table(name = "student")
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int studentID;
private String studentName;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "class_student", joinColumns = { @JoinColumn(name = "studentID") }, inverseJoinColumns = {
@JoinColumn(name = "classID") })
private Class clazz;
public int getStudentID() {
return studentID;
}
public void setStudentID(int studentID) {
this.studentID = studentID;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public Class getClazz() {
return clazz;
}
public void setClazz(Class clazz) {
this.clazz = clazz;
}
}
双向关系
(一对多,多对一)
只能从一端维护关系
Class
package entity.ManyToOne_OneTOMany;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Table(name = "class")
@Entity
public class Class {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int classID;
private String className;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="clazz")
private Set<Student> students;
public int getClassID() {
return classID;
}
public void setClassID(int classID) {
this.classID = classID;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
Student
package entity.ManyToOne_OneTOMany;
import javax.persistence.CascadeType;
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.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Table(name = "student")
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int studentID;
private String studentName;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "class_student", joinColumns = { @JoinColumn(name = "studentID") }, inverseJoinColumns = {
@JoinColumn(name = "classID") })
private Class clazz;
public int getStudentID() {
return studentID;
}
public void setStudentID(int studentID) {
this.studentID = studentID;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public Class getClazz() {
return clazz;
}
public void setClazz(Class clazz) {
this.clazz = clazz;
}
}