一、一对一单向关联:
1.@Id 主键
@GeneratedValue 主键自增,默认AUTO应用数据库的生成策略(相当于XML中的native,如果是mysql则调用auto_increment,如果是Oracle则调用hibernate_sequence),还有TABLE:使用一个特定的数据库表格来保存主键 ,SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列(一般用ORACLE的时候用这个),IDENTITY:主键由数据库自动生成(主要是自动增长型) 一般用Mysql的时候用这个
2.@OneToOne 一对一映射
@JoinColumn(name="student_id") 在teacher表中加一个自定义名称为“student_id”的外键映射字段
<pre name="code" class="java">import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Student {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
import javax.persistence.*;
@Entity
public class Teacher {
private int id;
private String name;
private Student student;
@Id
@GeneratedValue
public int getId() {
return id;
}
public String getName() {
return name;
}
@OneToOne
@JoinColumn(name="student_id")
public Student getStudent() {
return student;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setStudent(Student student) {
this.student = student;
}
}
二、一对一双向关联:
1. @OneToOne(mappedBy="student") :由另一方的student属性控制(准确的说应该是getStudent中的student控制,不过一般也没人去改这个名称)
import javax.persistence.*;
@Entity
public class Teacher {
private int id;
private String name;
private Student student;
@Id
@GeneratedValue
public int getId() {
return id;
}
public String getName() {
return name;
}
@OneToOne
@JoinColumn(name="student_id")
public Student getStudent() {
return student;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setStudent(Student student) {
this.student = student;
}
}
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
@Entity
public class Student {
private int id;
private String name;
private Teacher teacher;
@OneToOne(mappedBy="student")
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
三、多对一单向关联:
1.@ManyToOne :多对一
2.@JoinColumn(name="teacherid"):在多这一方增加一个teacherid的外键关联字段(永远在多的一方加外键关联字段)
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Student {
private int id;
private String name;
private int age;
private Teacher teacher;
@ManyToOne
@JoinColumn(name="teacherid")
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.Generated;
import javax.persistence.*;
@Entity
public class Teacher {
private int id;
private String name;
private String title;
private Date birthDate;
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
四、一对多单向关联:
import java.util.Date;
import java.util.*;
import javax.persistence.*;
@Entity
public class Teacher {
private int id;
private String name;
private String title;
private Date birthDate;
private Set<Student> student=new HashSet<Student>();
@OneToMany
@JoinColumn(name="teacher_id")
public Set<Student> getStudent() {
return student;
}
public void setStudent(Set<Student> student) {
this.student = student;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
import javax.persistence.*;
@Entity
public class Student {
private int id;
private String name;
private int age;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}
五、多对一双向关联:
1.一对多、多对一的双向关联一样,值得注意的有两点 :
@ManyToOne没有mappedBy属性(其他OneToMany、OneToOne、ManyToMany都有MappedBy属性),所以只能在@OneToMany上加MappedBy属性
@JoinColumn(name="teacherid")加在哪一边都都可以,结果都一样
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Student {
private int id;
private String name;
private int age;
private Teacher teacher;
@ManyToOne
@JoinColumn(name="teacherid")
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.Generated;
import javax.persistence.*;
@Entity
public class Teacher {
private int id;
private String name;
private String title;
private Date birthDate;
private Set<Student> student=new HashSet<Student>();
@OneToMany(mappedBy="teacher")
public Set<Student> getStudent() {
return student;
}
public void setStudent(Set<Student> student) {
this.student = student;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
六、多对多单向关联:
1.多对多关联会产生一张中间表,对中间表的设置使用@JoinTable,其中第一个参数name指定中间表的名称,第二个参数joincolumns指定多个外键关联字段,它的值是数组形式,这里只关联一个,就是本类在中间表中的外键名称,第三个参数是inverseJoinColumns反转设置多个外键关联字段,意思就是在本类设置另一个类在中间表中外键的名称,它的值也是数组类型,这里只设置一个外键。
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.Generated;
import javax.persistence.*;
@Entity
public class Teacher {
private int id;
private String name;
private String title;
private Date birthDate;
private Set<Student> student=new HashSet<Student>();
@ManyToMany
@JoinTable(name="t_s",
joinColumns={@JoinColumn(name="teacher_id")},
inverseJoinColumns={@JoinColumn(name="student_id")}
)
public Set<Student> getStudent() {
return student;
}
public void setStudent(Set<Student> student) {
this.student = student;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Student {
private int id;
private String name;
private int age;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}
七、多对多双向关联:
加一个MappedBy就行了。
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.Generated;
import javax.persistence.*;
@Entity
public class Teacher {
private int id;
private String name;
private String title;
private Date birthDate;
private Set<Student> student=new HashSet<Student>();
@ManyToMany
@JoinTable(name="t_s",
joinColumns={@JoinColumn(name="teacher_id")},
inverseJoinColumns={@JoinColumn(name="student_id")}
)
public Set<Student> getStudent() {
return student;
}
public void setStudent(Set<Student> student) {
this.student = student;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
@Entity
public class Student {
private int id;
private String name;
private int age;
private Set<Teacher> teacher=new HashSet<Teacher>();
@ManyToMany(mappedBy="student")
public Set<Teacher> getTeacher() {
return teacher;
}
public void setTeacher(Set<Teacher> teacher) {
this.teacher = teacher;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}
3.