Hibernate注解(二)

关系映射级别注解

一对一单向外键

  • @OneToOne(cascade=CascadeType.ALL)
  • @JoinColumn(name=”pid”, unique=true)

@OneToOne(cascade=)
表示级联关系
@JoinColumn(name=”pid”, unique=true)
表示外键关联, 对应关联类的列名

这里我们以学生和身份证号为模型,一个身份证号可以唯一的对应一个学生,一个学生有一个唯一的身份证号

@Entity
public class IDCard {

    @Id
    @GeneratedValue(generator="pid")
    @GenericGenerator(name="pid", strategy="assigned")
    @Column(length=18)
    private String pid;     // 身份证号码
    private String sname;   // 学生的姓名
}
@Entity
public class Student {

    @Id
    @GeneratedValue
    private int sid;
    private Date birthday;

    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="pid", unique=true)
    private IDCard idCard;
}

因为是Student中有一个指向IDCard表主键的字段pid,所以主控方是Student,所谓主控方就是能改变关联关系的一方,Student只要改变pid就改变了关联关系

一对一双向外键

  1. 主控方的配置同一对一单向外键关联
  2. @OneToOne(mappedBy=”idCard”) // 被控方

mappedBy中的属性是,主控方中外键的属性。
双向关联,必须设置mappedBy属性。因为双向关联只能交给一方去控制,不可能在双方都设置外键保存关联关系,否则双发都无法保存。

@Entity
public class IDCard {

    @Id
    @GeneratedValue(generator="pid")
    @GenericGenerator(name="pid", strategy="assigned")
    @Column(name = "pid", length=18)
    private String pid;     // 身份证号码
    private String sname;   // 学生的姓名

    @OneToOne(mappedBy="idCard")
    private Student student;
}

Student和上面一样没有任何改变

多对一单向外键

多方持有一方的引用, 比如:多个学生对应一个班级

@ManyToOne(cascade={CascadeType.All}, fetch=FetchType.EAGER)
fetch: 抓取策略。

@JoinColumn(name=”cid”, referencedColumnName=”id”)
name:多方外键的列名
referencedColumnName:一方主键的列名

/**
 * 教室,一的一方
 * @author whyalwaysmea
 */
@Entity
public class ClassRoom {

    @Id
    @Column(name="id")
    @GeneratedValue(generator="cid")
    @GenericGenerator(name="cid", strategy="uuid")
    private String classRoomId;

    private String classRoomName;

}
/**
 * 学生类,多的一方
 * @author whyalwaysmea
 */
@Entity
public class Student {

    @Id
    @GeneratedValue
    private int sid;
    private String sname;

    @ManyToOne(cascade= {CascadeType.ALL}, fetch=FetchType.EAGER)
    @JoinColumn(name="cid", referencedColumnName="id")
    private ClassRoom classRoom;
}

一对多单向外键

一方持有多方的集合,一个班级有多个学生

@OneToMany(cascade={CascadeType.All}, fetch=FetchType.LAZY)
@JoinColumn(name=”cid”)

多对多单向外键

学生和教师构成多对多的关联关系
其中一个多方持有另一个多方的集合对象(学生持有教室的集合)
创建中间表

@Entity
public class Teacher {

    @Id
    @GeneratedValue(generator="tid")
    @GenericGenerator(name="tid", strategy="uuid")
    private String tid;

    private String tname;
}
@Entity
public class Student {

    @Id
    @GeneratedValue(generator="sid")
    @GenericGenerator(name="sid", strategy="uuid")
    private String sid;

    private String sname;

    @ManyToMany
    @JoinTable(name = "teachers_students", 
            inverseJoinColumns = {@JoinColumn(name = "teacherId", referencedColumnName="tid")},
                    joinColumns = {@JoinColumn(name = "studentId", referencedColumnName="sid")} 
    )
    private Set<Teacher> teachers = new HashSet<>();
}

mappedBy

hibernate基于注解的维护权反转:@OneToMany(mappedBy=)

参考

代码下载
Hibernate注解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值