Hibernate注解式开发

本文介绍了Hibernate注解式开发的优势,详细讲解了@Entity、@Id、@Column等基础注解的使用,并通过实例展示了如何使用@OneToOne、@OneToMany、@ManyToOne和@ManyToMany注解实现一对一、一对多、多对一和多对多的关联关系。通过注解,开发者可以更简洁地建立Java实体类与数据库表的映射。
摘要由CSDN通过智能技术生成

注:本文仅记录注解式开发的方法,HIbernate基本配置和基本使用见文章一,注解式关联映射开发见文章二。
文章一:Hibernate基本使用
文章二:Hibernate多表的关联关系、懒加载

一、注解式开发的优点:

Hibernate支持XML式开发与注解式开发,前面我们已经学过XML开发,XML开发中我们需要为每个实体类创建XML映射文件,通过XML映射文件建立数据库表与JAVA实体类的映射关系。

而注解式开发通过在JAVA实体类中使用JPA注解来建立数据库表与JAVA实体类的映射关系,不必再为每个实体类编写XML文件。

二、基本注解的使用:

注解含义
@Entity用在类上,将类与数据库表建立一一对应关系
@Id该注解下的属性对应数据库表的主键
@Column该注解为每个属性与数据库字段建立一一对应关系
@Basic主键使用@Id,非主键使用该注解
@Entity(name = "student")
public class Student {
    @Id
    @Column(name = "stuNo")
    private String stuNo;
    @Basic
    @Column(name = "stuName")
    private String stuName;
    @Basic
    @Column(name = "stuClass")
    private String stuClass;

    public String getStuNo() {
        return stuNo;
    }
    public void setStuNo(String stuNo) {
        this.stuNo = stuNo;
    }
    public String getStuName() {
        return stuName;
    }
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
    public String getStuClass() {
        return stuClass;
    }
    public void setStuClass(String stuClass) {
        this.stuClass = stuClass;
    }
}

这样就将Student类与student表建立了关系,通过操作Student对象就可以对student表进行增删查改操作了。(具体CRUD操作间文章一)

三、多表关联关系:

XML式的多表关联关系见文章二,这里我们看一下如何使用注解建立多表的关联关系。

注解含义
@OneToOne一对一关联
@OneToMany一对多关联
@ManyToOne多对一关联
@ManyToMany多对多关联
@JoinColumn外键
@JoinTable多对多关联中关联的表

1.一对一单向关联:

班级表和班长表,班级表中有班长id字段。

@Entity(name = "clas")
public class Clas {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    @Column(name = "clasNo")
    private String clasNo;
    @Basic
    @Column(name = "clasName")
    private String clasName;
    //班级表中有班长类的对象,并使用@OneToOne注解建立关联关系,使用@JoinColumn标明外键
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "clasMonitorNo")
    private Monitor monitor;
}
@Entity(name = "monitor")
public class Monitor {
    @Id
    @Column(name = "monitorNo")
    private String monitorNo;
    @Basic
    @Column(name = "monitorName")
    private String monitorName;
}

2.一对一双向关联:

班级表和班长表,班级表中有班长id字段,班长表中有班级id字段。

@Entity(name = "monitor")
public class Monitor {
    @Id
    @Column(name = "monitorNo")
    private String monitorNo;
    @Basic
    @Column(name = "monitorName")
    private String monitorName;
    //班长表中有班级类的对象,并使用@OneToOne注解建立关联关系,使用@JoinColumn标明外键
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "monitorClassNo")
    private Clas clas;
}
@Entity(name = "clas")
public class Clas {
    @Id
    @Column(name = "clasNo")
    private String clasNo;
    @Basic
    @Column(name = "clasName")
    private String clasName;
	//班级表中有班长对象,使用mappedBy与班长类建立关联,形成双向关联    
    @OneToOne(mappedBy = "clas")
    private Monitor monitor;
}

3.一对多(多对一)双向关联:

学校表和学院表,学院表中有学校id字段。

@Entity(name = "shcool")
public class School {
    @Id
    @Column(name = "schoolNo")
    private String schoolNo;
    //学校表是一方,使用@OneToMany
    @OneToMany(mappedBy = "school")
    private List<Academy> academys;
}
@Entity(name = "academy")
public class Academy {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    @Column(name = "academyNo")
    private String academyNo;
    @Basic
    @Column(name = "academyName")
    private String academyName;
    //学院表是多方,使用@ManyToOne
    @ManyToOne
    @JoinColumn(name = "academySchoolNo")
    private School school;
}

4.多对多双向关联:

学生表和选课表,多对多关联中还应有一张中间表。

public class Student{
	//JoinTable的name是中间表表名,joinColumns指定中间表中关联自己ID的字段,inverseJoinColumns表示中间表中关联对方ID的字段,joinColumn是列名
	@ManyToMany
	@JoinTable(name="sc",joinColumns={@JoinColumn(name="stuid")},inverseJoinColumns{@JoinColumn(name="cno")})
	private List<Course> courses;
}
public class Course implements Serializable { 
	@ManyToMany(mappedBy="courses")
	private List<Student> students;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姓蔡小朋友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值