hibernate 关联关系 详解

在写本片博文之前 先在数据库中注册以下数据表格 方便测试


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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值