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 : 多对多关联的另一边与中间表之间的联系)
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 原神:提瓦特的另一个旅行者 我用游戏改变了时间线 学霸文明辅助系统 龙族里的暗裔剑魔 无限进化:我加入了万界聊天群 和女魔头夫人苟在江湖的日子 我在综漫世界推销精灵 我不可能会录这种自述 没人比我更懂禁忌 四合院之飞扬年代 50块上单,只好去LCK打替补 莽荒纪之长生之路 死神:从统治虚圈开始 这位公子深藏不露 神话之门 诸天抽奖:开局段誉巅峰内力 杀手的退休柯学纪实 借神长生:从拐走仇人的道侣开始 暮年修仙的我长生不死 无尽海域,我以养妖求长生 吞噬星空之我躺平了也变强了 跑山人:我的属性加点人生 从九牛二虎开始无敌 高达SEED之前进四 龙族:从道诡异仙归来的路明非 穿越凡人我能无限升级 超神:无限知识,我带文明飞升! 重回八二做个好人 从斗罗开始:杀戮之都遇比比东 秦时:从监禁焰灵姬开始 重生之四合院的日子 权游之凛冬龙主 美利坚:我就是华尔街大公牛 我的宠兽词条过于离谱 末世诡海:全民加点孤艇求生 超神:开局奖励修罗铠甲 我在火影苟到无敌 我,巨星,劝退粉丝 身为草神:我无敌,你随意 娱乐:让你录综艺,你成影帝了? 关于我成了祖国人这档事