Hibernate-Annotation

课程地址

使用hibernate注解的目的

为了简化ORM映射文件(*.hbm)繁琐的配置。
注解需要做的是映射文件要做的。

JPA与Hibernate

Java Persistence API
Java持久化接口
JPA是标准接口,HIbernate是JPA的实现,但是功能是JAP的超集。

Hibernate注解分类

  1. 类级别注解
    1. @Entity
    2. @Table
    3. @Embeddable(嵌入类)
  2. 属性级别注解
  3. 映射关系注解

一,类级别注解

1. @Entity

Entity

1. 编写Entity
设置主键,打在getter上@Id
2. class添加注解@Entity
3. 在核心配置文件中配置

<!--映射文件-->
        <mapping class="Entity.Student"/>

2. @Table

@Table

@Tabel(name="")和@Entity(name="")

@Table's name attribute is the actual table name. @Entitiy's name is useful if you have two @Entity classes with the same name and you need a way to differentiate them when running queries.
From Stack Overflow

3. @Embeddable

表示一个非Entity类可以嵌套到另一个Entity中,作为另一个Entity的属性。

package Entity;

import javax.persistence.Embeddable;

/**
 * Created by futao on 2017/9/27.
 */

/**
 * 嵌入类,不会生成表,可能在其他表作为属性存在
 */
@Embeddable
public class Gf {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

package Entity;

/**
 * Created by futao on 2017/9/26.
 */

import javax.persistence.Column;
import javax.persistence.Entity;    //JPA注解
import javax.persistence.Id;
import javax.persistence.Table;
import java.sql.Timestamp;


/**
 * 学生实体类
 */
@Entity
@Table(name = "imooc_student1")
public class Student {
    /**
     * 主键
     */
    @Column(name = "sid")
    private int sid;
    /**
     * 姓名
     */
    @Column(name = "sname")
    private String sname;
    /**
     * 性别
     */
    @Column(name = "gender")
    private String gender;
    /**
     * 生日
     */
    @Column(name = "birthday")
    private Timestamp birthday;
    /**
     * 专业
     */
    @Column(name = "major")
    private String major;
    /**
     * 地址
     */
    private String address;

    //组件属性
    private Gf gf;

    @Id
    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public Gf getGf() {
        return gf;
    }

    public void setGf(Gf gf) {
        this.gf = gf;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Timestamp getBirthday() {
        return birthday;
    }

    public void setBirthday(Timestamp birthday) {
        this.birthday = birthday;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

二,属性级别注解

添加方式
1.写在属性字段上面
2.写在getter上面

@Id
@SequenceGenerator
@GeneratedValue
@Column
@Embedded
@EmbeddedId
@Lob
@Version
@Basic
@Transient

1. @Id

@Id

可以给一个Entity设置两个主键,不过要实现Serializable接口

2. @GeneratedValue

GeneratedValue
example

3. @GeneratedValue

4. @Column

Column

5. @Embedded,@EmbeddedId

打在被标记为@Embeddable的嵌入类的实例上,或者getter上

@Embedded

6. @Transient

@Transient

三,关系映射级别注解

关系映射级别注解

1. 一对一单向外键关联(两张表都要在hibernate住配置文件中进行配置)

一对一单向外键关联
//主表
package Entity;

import javax.persistence.*;
import java.sql.Timestamp;

/**
 * Created by futao on 2017/9/27.
 */
@Entity
@Table(name = "imooc_student")
public class Student {
    /**
     * 主键,学号
     */
    @Id
    @GeneratedValue
    private int sid;
    /**
     * 性别
     */
    private String gender;
    /**
     * 生日
     */
    private Timestamp birthday;
    /**
     * 专业
     */
    private String major;
    /**
     * 身份证对象
     */
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "pid",unique = true)
    private IdCard idCard;

    public IdCard getIdCard() {
        return idCard;
    }

    public void setIdCard(IdCard idCard) {
        this.idCard = idCard;
    }

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }


    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Timestamp getBirthday() {
        return birthday;
    }

    public void setBirthday(Timestamp birthday) {
        this.birthday = birthday;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }
}

//关联表
package Entity;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

/**
 * Created by futao on 2017/9/27.
 */
@Entity
@Table(name = "imoooc_id_card")
public class IdCard {
    @Id
    @GeneratedValue(generator = "pid")
    @GenericGenerator(name="pid",strategy = "assigned")
    @Column(length = 18)
    private String pid;
    private String sname;
    private String address;

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
//Test
    @Test
    fun dbtest() {
        session.save(IdCard().apply {
            pid = "11"
            sname = "熊anger"
            address = "上海小二房"
        })
        session.save(Student().apply {
            gender = "男"
            birthday = Timestamp(DateTime.now().millis)
            major = "计算机"
            idCard = session.get(Student::class.java, 2) as IdCard
        })
    }

2. 不推荐使用双向外键关联

3. 多对一单向外键关联

//多的那一方
package ManyToOne;

import javax.persistence.*;
import java.sql.Timestamp;

/**
 * Created by futao on 2017/9/28.
 */

/**
 * 学生实体类
 */
@Entity
@Table(name = "imooc_senior_student")
public class Student {

    @Id
    @GeneratedValue
    private int sid;
    private String gender;
    private Timestamp birthday;
    private String major;

    /**
     * 一对多单向外键关联关系
     * 级联关系:全级连
     * 抓取策略
     */
//@joinColumn(name="对用生成的表中的字段名",referencedColumnName="一的那一方的主键名")
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "fuckyou",referencedColumnName ="cid" )
    private Classroom classroom;

    public Classroom getClassroom() {
        return classroom;
    }

    public void setClassroom(Classroom classroom) {
        this.classroom = classroom;
    }

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Timestamp getBirthday() {
        return birthday;
    }

    public void setBirthday(Timestamp birthday) {
        this.birthday = birthday;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }
}

//一的那一方
package ManyToOne;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

/**
 * Created by futao on 2017/9/28.
 */

/**
 * 班级实体类
 */
@Entity
@Table(name = "imooc_senior_classroom")
public class Classroom {
    @Id
    @GeneratedValue(generator = "cid")
    @GenericGenerator(name = "cid",strategy = "assigned")
    @Column(length = 4)
    private String cid;
    private String cname;

    public String getCid() {
        return cid;
    }

    public void setCid(String cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }
}

4. 多对多单向外键

多对多会生成一张中间表存储对应关系

ManyToMany
package Many2Many;

import javax.persistence.*;
import java.sql.Timestamp;
import java.util.Set;

/**
 * Created by futao on 2017/9/28.
 */
@Entity
@Table(name = "many2many_student")
public class Student {

    @Id
    @GeneratedValue
    private int sid;
    private String name;
    private String gender;
    private Timestamp birthday;
    private String major;

    /**
     * 学生持有教师的集合
     */
    @ManyToMany
    @JoinTable(
            //中间表的名字
            name = "student_teacher",
            joinColumns = {@JoinColumn(name = "sid")},
            inverseJoinColumns = {@JoinColumn(name = "tid")}
    )
    private Set<Teacher> teacherSet;

    public Set<Teacher> getTeacherSet() {
        return teacherSet;
    }

    public void setTeacherSet(Set<Teacher> teacherSet) {
        this.teacherSet = teacherSet;
    }

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Timestamp getBirthday() {
        return birthday;
    }

    public void setBirthday(Timestamp birthday) {
        this.birthday = birthday;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }
}

package Many2Many;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

/**
 * Created by futao on 2017/9/28.
 */
@Entity
@Table(name = "many2many_teacher")
public class Teacher {
    @Id
    @GeneratedValue(generator = "tid")
    @GenericGenerator(name = "tid", strategy = "assigned")
    @Column(length = 4)
    private String tid;
    private String tname;

    public String getTid() {
        return tid;
    }

    public void setTid(String tid) {
        this.tid = tid;
    }

    public String getTname() {
        return tname;
    }

    public void setTname(String tname) {
        this.tname = tname;
    }
}

@Test
    fun many2many(){
        val t1=Teacher().apply {
            tid="T001"
            tname="张老师"
        }
        val t2=Teacher().apply {
            tid="t999"
            tname="吴彦祖"
        }

        val teachers=HashSet<Teacher>()
        teachers.add(t1)
        teachers.add(t2)

        val s1=Many2Many.Student().apply {
            name="熊老一"
            gender="男"
            birthday= Timestamp(DateTime.now().millis)
            major="计算机"
            teacherSet=teachers
        }
        val s2= Many2Many.Student().apply {
            name="熊老二"
            gender="男"
            birthday= Timestamp(DateTime.now().millis)
            major="软件工程"
        }
        val s3=Many2Many.Student().apply {
            name="李子"
            gender="女"
            birthday= Timestamp(DateTime.now().millis)
            major="建筑学"
            teacherSet=teachers
        }

        session.save(t1)
        session.save(t2)
        session.save(s1)
        session.save(s2)
        session.save(s3)
    }

5. 多对多双向外键关联

Many2Many

总结

image.png
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容