hibernate 关联关系 详解
来源:互联网 发布:淘宝一件代发挣钱吗 编辑:程序博客网 时间:2024/05/16 14:14
在写本片博文之前 先在数据库中注册以下数据表格 方便测试
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 : 多对多关联的另一边与中间表之间的联系)
阅读全文
0 0
- hibernate 关联关系 详解
- hibernate教程--关联关系的映射详解
- Hibernate关联关系
- Hibernate中的关联关系
- Hibernate自关联关系
- hibernate关联关系
- hibernate 关联关系配置
- Hibernate关联关系
- hibernate 关联关系
- Hibernate 关联关系
- Hibernate关联关系
- hibernate关联关系映射
- Hibernate关联关系配置
- Hibernate映射关联关系
- Hibernate关联关系配置
- Hibernate关联关系映射
- Hibernate关联关系映射
- hibernate 关联关系映射
- 框架之 hibernate之关联关系映射
- 框架之 hibernate之各种查询
- 全源码教你一键锁屏
- 框架之Struts2简单入门
- java导出Excel 总结
- hibernate 关联关系 详解
- 六种获取配置properties文件的方法
- Linux 安装mysql后修改密码策略
- mybatis+spring 方式一
- GSON 报错HibernateProxy. Forgot to register a type adapter? 的解决办法
- Oracle12c DataGuard 物理备库的简单配置
- 【caffe】windows下vs2013+opencv3.2.0+opencv_contrib(包含dnn)+cmake3.8编译与配置
- structs2----数据封装以及拦截器
- 逃离迷宫