一、关键字
@Id:主键属性 定义多个主键属性 ,必须实现serializable
@SequenceGenerator
@GeneratedValue
@Column
@Embedded
@EmbeddedId
@Lob
@Version
@Basic
@Transient:表示该属性并非一个到数据库表的字段映射,ORM 框架将忽略该属性,ORM 默认为@Basic
二、关系映射级别注解
1.一对一单向外键关联
2.一对一双向外键关联
3.一对一单向外键联合主键
4.多对一单向外键关联
5.一对多单向外键关联
6.一对多双向外键关联
7.多对多单向外键关联
8.多对多双向外键关联
三.实体间的映射关系
1.一对一:一个公民对应一个身份证号
2.一对多(多对一):一个公民可以有多个账号
3.多对多:一个学生可以有多个老师,一个老师可以有多个学生
1.一对一单向外键关联
创建IdCard表(身份证)
@Entity
public class IdCard {
private String cardNumber;
private String sname;
@Id
@GeneratedValue(generator = "cardNumber")
@GenericGenerator(name="cardNumber",strategy = "assigned")
@Column(length=18)
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public IdCard() {
}
public IdCard(String cardNumber, String sname) {
this.cardNumber = cardNumber;
this.sname = sname;
}
}
创建Students类(学生)
@Entity
public class Students {
private String sid ;
private String gender;
private Date birthday;
private String major;
private IdCard idCard;
public Students(){
}
public Students(String gender, String sid, Date birthday, String major,IdCard idCard) {
this.gender = gender;
this.sid = sid;
this.birthday = birthday;
this.major = major;
this.idCard = idCard;
}
@Id
@GeneratedValue(generator = "sid")
@GenericGenerator(name="sid",strategy = "assigned")
@Column(length=8)
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "cardNumber")
public IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
}
}
2.一对一双向外键关联
package ec.efeiyi.com;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
/**
* Created by Administrator on 2016/6/23.
*/
@Entity
public class IdCard {
private String cardNumber;
private String sname;
private Students students;
@Id
@GeneratedValue(generator = "cardNumber")
@GenericGenerator(name="cardNumber",strategy = "assigned")
@Column(length=18)
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@OneToOne(mappedBy = "idCard")
public Students getStudents() {
return students;
}
public void setStudents(Students students) {
this.students = students;
}
public IdCard() {
}
public IdCard(String cardNumber, String sname) {
this.cardNumber = cardNumber;
this.sname = sname;
}
}
一对多单向外键关联
例如一个ClassRoom可以有多个学生
ClassRoom类
@Entity
public class ClassRoom {
private String cid;//班级编号
private String cname;//班级名字
private List<Students> stu;//一方持有多方集合
public ClassRoom(){
}
public ClassRoom(String cid, String cname) {
this.cid = cid;
this.cname = cname;
}
@Id
@GeneratedValue(generator = "cid")
@GenericGenerator(name="cid",strategy = "assigned")
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;
}
@OneToMany(cascade = {CascadeType.ALL},fetch = FetchType.LAZY)
@JoinColumn(name="cid")
public List<Students> getStu() {
return stu;
}
public void setStu(List<Students> stu) {
this.stu = stu;
}
}
Students类
@Entity
public class Students {
private String sid ;
private String gender;
private Date birthday;
private String major;
public Students(){
}
public Students(String gender, String sid, Date birthday, String major) {
this.gender = gender;
this.sid = sid;
this.birthday = birthday;
this.major = major;
}
@Id
@GeneratedValue(generator = "sid")
@GenericGenerator(name="sid",strategy = "assigned")
@Column(length=8)
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
}
生成表结构students
生成表结构classroom
多对多单向外键关联
教师和学生构成多对多的关联关联关系
其中一个多方持有另一个多方集合(学生持有教师集合)
类别和商品多对多的关系(小电器和剃须刀)
为甚么需要中间表
Students类
@Entity
public class Students {
private String sid ;
private String gender;
private Date birthday;
private String major;
private List<Teachers> teacherList;
public Students(){
}
public Students(String gender, String sid, Date birthday, String major) {
this.gender = gender;
this.sid = sid;
this.birthday = birthday;
this.major = major;
}
@Id
@GeneratedValue(generator = "sid")
@GenericGenerator(name="sid",strategy = "assigned")
@Column(length=8)
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
@ManyToMany
@JoinTable(name="teachers_students",joinColumns = {@JoinColumn(name="sid")},inverseJoinColumns = {@JoinColumn(name="tid")})
public List<Teachers> getTeacherList() {
return teacherList;
}
public void setTeacherList(List<Teachers> teacherList) {
this.teacherList = teacherList;
}
}
Techers类
@Entity
public class Teachers {
private String tid;
private String name;
@Id
@GeneratedValue(generator = "tid")
@GenericGenerator(name="tid",strategy = "assigned")
public String getTid() {
return tid;
}
public void setTid(String tid) {
this.tid = tid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
生成数据库students
生成数据库表teachers
生成数据库表
save操作案例
Session session = getSession();
Transaction tran = session.beginTransaction();
try {
Students s1 = new Students();
s1.setSid("10000001");
s1.setMajor("cs");
s1.setGender("male");
s1.setBirthday(new Date());
ArrayList<Teachers> list = new ArrayList<>();
Teachers t1 = new Teachers();
t1.setTid("t0001");
t1.setName("Mr.Wang");
Teachers t2 = new Teachers();
t2.setTid("t0002");
t2.setName("Mr.Chow");
list.add(t1);
list.add(t2);
s1.setTeacherList(list);
session.save(t1);
session.save(t2);
session.save(s1);
tran.commit();
} finally {
session.close();
}
双向多对多的映射
Techers类
@Entity
public class Teachers {
private String tid;
private String name;
private List<Students> studentList;
@Id
@GeneratedValue(generator = "tid")
@GenericGenerator(name="tid",strategy = "assigned")
public String getTid() {
return tid;
}
public void setTid(String tid) {
this.tid = tid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany(mappedBy = "teacherList")
public List<Students> getStudentList() {
return studentList;
}
public void setStudentList(List<Students> studentList) {
this.studentList = studentList;
}
}
Students类
@Entity
public class Students {
private String sid ;
private String gender;
private Date birthday;
private String major;
private List<Teachers> teacherList;
public Students(){
}
public Students(String gender, String sid, Date birthday, String major) {
this.gender = gender;
this.sid = sid;
this.birthday = birthday;
this.major = major;
}
@Id
@GeneratedValue(generator = "sid")
@GenericGenerator(name="sid",strategy = "assigned")
@Column(length=8)
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
@ManyToMany
@JoinTable(name="teachers_students",joinColumns = {@JoinColumn(name="sid")},inverseJoinColumns = {@JoinColumn(name="tid")})
public List<Teachers> getTeacherList() {
return teacherList;
}
public void setTeacherList(List<Teachers> teacherList) {
this.teacherList = teacherList;
}
}