在写本片博文之前 先在数据库中注册以下数据表格 方便测试
CREATE TABLE `test_studentinfo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sid` int(11) DEFAULT NULL,
`card` char(18) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK9AF4A93C826CC8FA` (`sid`),
CONSTRAINT `FK9AF4A93C826CC8FA` FOREIGN KEY (`sid`) REFERENCES `test_student` (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TABLE `test_student_choice_curriculum` (
`choice_id` int(11) NOT NULL AUTO_INCREMENT,
`sid` int(11) DEFAULT NULL,
`curriculum_id` int(11) DEFAULT NULL,
PRIMARY KEY (`choice_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `test_student` (
`sid` int(11) NOT NULL AUTO_INCREMENT,
`class_id` int(11) NOT NULL DEFAULT '0',
`name` varchar(255) DEFAULT NULL,
`sex` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`sid`),
KEY `FK4347BB8E321E8D39` (`class_id`),
CONSTRAINT `FK4347BB8E321E8D39` FOREIGN KEY (`class_id`) REFERENCES `test_classinfo` (`class_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TABLE `test_curriculum` (
`curriculum_id` int(11) NOT NULL AUTO_INCREMENT,
`curriculum_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`curriculum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `test_classinfo` (
`class_id` int(11) NOT NULL AUTO_INCREMENT,
`class_name` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`class_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
讲解一下每张表存储的内容
test_classinfo : 班级表
test_curriculum : 课程表
test_student : 学生表
test_student_choice_curriculum : 学生表和课程表之间的中间表
test_studentinfo : 学生身份证号码存储表
各个表之间的关系注解程序,代码很多,我就直接贴上去了。后面会详细讲解。
package hibernate.entity;
import java.util.List;
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.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
/**
* 学生
* */
@Entity
@Table(name="test_student")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class Student
{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="sid",nullable=false,columnDefinition="comment 'primary key auto increment'")
private int sid;
@Column(name="name",nullable=false,columnDefinition="comment 'this is name'")
private String name;
@Column(name="sex")
private String sex;
@Column(name="class_id",nullable=false)
private int classId;
@Column(name="age")
private int age;
/**
* 关联关系 : 多对一
*/
@ManyToOne(targetEntity=ClassInfo.class,cascade=CascadeType.REFRESH,fetch=FetchType.LAZY)
@JoinColumn(name="class_id",referencedColumnName="class_id",insertable=false,updatable=false)
private ClassInfo classInfo;
/**
* 关联关系 : 一对一
*/
@OneToOne(targetEntity=StudentInfo.class,cascade={CascadeType.REFRESH,CascadeType.REMOVE},fetch=FetchType.LAZY)
@JoinColumn(name="sid",referencedColumnName="sid",insertable=false,updatable=false)
private StudentInfo studentInfo;
/**
* 关联关系 : 多对多
*/
@ManyToMany(targetEntity=Curriculum.class,cascade=CascadeType.REFRESH,fetch=FetchType.LAZY)
@JoinTable(
name="test_student_choice_curriculum",
joinColumns={
@JoinColumn(name="sid",referencedColumnName="sid",insertable=false,updatable=false)
},
inverseJoinColumns={
@JoinColumn(name="curriculum_id",referencedColumnName="curriculum_id")
}
)
private List<Curriculum> curriculum;
public void setSid(int sid)
{
this.sid = sid;
}
public int getSid()
{
return this.sid;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return this.age;
}
public void setSex(String sex)
{
this.sex = sex;
}
public String getSex()
{
return this.sex;
}
public void setClassId(int class_id)
{
this.classId = class_id;
}
public int getClassId()
{
return this.classId;
}
public void setClassInfo(ClassInfo classInfo)
{
this.classInfo = classInfo;
}
public ClassInfo getClssInfo()
{
return this.classInfo;
}
public void setStudentInfo(StudentInfo studentInfo)
{
this.studentInfo = studentInfo;
}
public StudentInfo getStudentInfo()
{
return this.studentInfo;
}
public void setCurriculum(List<Curriculum> curriculum)
{
this.curriculum = curriculum;
}
public List<Curriculum> getCurriculum()
{
return this.curriculum;
}
}
package hibernate.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.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
/**
* 身份证
*/
@Entity
@Table(name="test_studentinfo")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class StudentInfo
{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id",nullable=false)
private int id;
@Column(name="sid",nullable=false)
private int sid;
@Column(name="card")
private String card;
@OneToOne(targetEntity=Student.class,cascade=CascadeType.REFRESH,fetch=FetchType.LAZY)
@JoinColumn(name="sid",referencedColumnName="sid",insertable=false,updatable=false)
private Student student;
public void setId(int id)
{
this.id = id;
}
public int getId()
{
return this.id;
}
public void setSid(int sid)
{
this.sid = sid;
}
public int getSid()
{
return this.sid;
}
public void setCard(String card)
{
this.card = card;
}
public String getCard()
{
return this.card;
}
public void setStudent(Student student)
{
this.student = student;
}
public Student getStudent()
{
return student;
}
}
package hibernate.entity;
import java.util.List;
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.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
/**
* 班级
*/
@Entity
@Table(name="test_classinfo")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class ClassInfo
{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="class_id")
private int classId;
@Column(name="class_name",nullable=false)
private String className;
@OneToMany(targetEntity=Student.class,cascade={CascadeType.REMOVE,CascadeType.REFRESH},fetch=FetchType.LAZY)
@LazyCollection(LazyCollectionOption.EXTRA)
@JoinColumn(name="class_id",referencedColumnName="class_id",insertable=false,updatable=false)
private List<Student> studentCollection;
public void setClassId(int class_id)
{
this.classId = class_id;
}
public int getClassId()
{
return this.classId;
}
public void setClassName(String className)
{
this.className = className;
}
public String getCalssName()
{
return this.className;
}
public void setStudentColletion(List<Student> listStudent)
{
this.studentCollection = listStudent;
}
public List<Student> getStudentColletion()
{
return this.studentCollection;
}
}
package hibernate.entity;
import java.util.List;
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.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
/**
* 课程表
*/
@Entity
@Table(name="test_curriculum")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class Curriculum
{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="curriculum_id",nullable=false)
private int id;
@Column(name="curriculum_name",nullable=false)
private String curriculumName;
@ManyToMany(targetEntity=Student.class,cascade={CascadeType.REFRESH,CascadeType.REMOVE},fetch=FetchType.LAZY)
@JoinTable(
name="test_student_choice_curriculum",
joinColumns={
@JoinColumn(name="curriculum_id",referencedColumnName="curriculum_id",insertable=false,updatable=false)
},
inverseJoinColumns={
@JoinColumn(name="sid",referencedColumnName="sid")
}
)
private List<Student> students;
public void setId(int id)
{
this.id = id;
}
public int getId()
{
return this.id;
}
public void setCurriculumName(String curriculumName)
{
this.curriculumName = curriculumName;
}
public String getCurriculumName()
{
return this.curriculumName;
}
public void setStudents(List<Student> students)
{
this.students = students;
}
public List<Student> getStudents()
{
return this.students;
}
}
关联关系 : 一对一 @OneToOne
从数据库表的结构我们可以发现 test_student 和 test_studentinfo 存在着一对一的关系
Student.java 中 注解详解
@OneToOne(targetEntity=StudentInfo.class,cascade={CascadeType.REFRESH,CascadeType.REMOVE},fetch=FetchType.LAZY)
@JoinColumn(name="sid",referencedColumnName="sid",insertable=false,updatable=false)
private StudentInfo studentInfo;
@OneToOne : 声明本实体与xxxx存在一对一关系
@OneToOne 属性{
targetEntity : 目标实体 (我的例子中以为 本实例与StudentInfo.class 存在一对一关系)
cascade : 级联关系 //详情查看其它博客,这个很重要,我也不知道怎么去表达。 不过这个很重要哦
fetch : 加载 (FetchType 取值 本例解说
FetchType.LAZY 懒加载 : 只有在调用实体getStudentInfo 实体获取的时候才加载该实体 性能好
FetchType.EAGER 急加载 : 每次生成本例实体的时候同时加载该实体 性能不好
)
}
@JoinColumn(
name : 本例映射表与关联表的外键关联列名
referencedColumnName : 关联表与本例映射关联表相关的列名
insertable,updatable : 因为我在前面已经定义外键列名的相关配置。所以需要生命该两个字段的值为false 否则报错,原因是同一个表中不能存在同名列名
)
关联关系 : 一对多 @OneToMany
属性注解与上一样
关联关系 : 多对多 @ManyToMany
@JoinTable(
name : 多对多关联关系中间表 (test_student 和 test_curriculumn 的中间表为test_student_choice_curriculum 所以我这里name 属性的是test_student_choice_curriculum)
joinColumns : 中间表与本类映射的表之间的关联列 详情看我写的示例
inverseJoinColumns : 多对多关联的另一边与中间表之间的联系
)