一对一关联
演示示例:
创建实体类:
@Entity
@Table
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int personid;
@Column
private String personname;
...........
以下省略GET和SET等方法
@Entity
@Table(name = "idcard")
public class IdCard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int cardid;
@Column
private String cardnumber;
@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "personid")
private Person person;
...........
以下省略GET和SET等方法
注解说明:
@Entity表示是实体
@Table表示创建当前实体表格,name的值表示创建表格的名称,如不设置,默认是实体类名
@Id表示创建表示时,该属性映射的列为主键
@GeneratedValue(strategy = GenerationType.IDENTITY)表示主键自增
@Column表示当前属性映射生成表格字段,name值为表格字段名称,如不设置,默认是属性名
@JoinColumn(name = "personid")表示关联外键的列名
@OneToOne(cascade = CascadeType.PERSIST)当前表为一对一关联,cascade = 表示当前表对关联表进行级联操作。具体级联操作如下:
CascadeType.PERSIST只有A类新增时,会级联B对象新增。若B对象在数据库存(跟新)在则抛异常(让B变为持久态)
CascadeType.MERGE指A类新增或者变化,会级联B对象(新增或者变化)
CascadeType.REMOVE只有A类删除时,会级联删除B类;
CascadeType.ALL包含所有;
测试代码:
@SpringBootTest
class TestOneToOne {
@Autowired
private CardRepository cardRepository;
@Test
void testAdd(){
Person person = new Person("杨百万");
IdCard idCard = new IdCard("411011199909091213",person);
cardRepository.save(idCard);
}
}
通过控制台输入的SQL语句,可以看出级联插入了数据
Hibernate: insert into person (personname) values (?)
Hibernate: insert into idcard (cardnumber, personid) values (?, ?)
一对多关联
演示示例:
@Entity
@Table
public class Dept {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int Deptid;
@Column
private String Deptname;
// mappedBy属性,拥有关系的字段。
@OneToMany(mappedBy = "dept",cascade = CascadeType.PERSIST)
private List<Emp> emps;
...........
以下省略GET和SET等方法
@Entity
@Table
public class Emp {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int empid;
@Column
private String empname;
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "deptid")
private Dept dept;
...........
以下省略GET和SET等方法
注解说明:
@OneToMany在一方中使用,表示一对多的关联,mappedBy值,表示当前属性的泛型拥有关系的字段。
@ManyToOne在多方中使用,表示多对一的关联,
cascade跟一对一中一样,设置级联,此时的cascade设置在一方或多方任意一方都行,向使用那边进行级联操作,就设置到那边中
测试代码:
@SpringBootTest
class TestOneToMany {
@Autowired
private DeptRepository deptRepository;
@Test
void testAdd(){
Dept dept= new Dept("开发部");
Emp emp1 = new Emp("张三");
Emp emp2 = new Emp("李四");
List<Emp>emps =new ArrayList<>();
emps.add(emp1);
emps.add(emp2);
dept.setEmps(emps);
deptRepository.save(dept);
}
}
通过控制台输入的SQL语句,可以看出级联插入了一个部门,二个员工
Hibernate: insert into dept (deptname) values (?)
Hibernate: insert into emp (deptid, empname) values (?, ?)
Hibernate: insert into emp (deptid, empname) values (?, ?)
多对多的关联
演示示例:
@Entity
@Table
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int stuid;
@Column
private String stuname;
@ManyToMany(cascade = CascadeType.PERSIST)
@JoinTable(name = "student_course", joinColumns = @JoinColumn(name = "stuid") , inverseJoinColumns = @JoinColumn(name = "cid"))
private Set<Course> courses = new HashSet<>();
@Entity
@Table
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int cid;
@Column
private String cname;
@ManyToMany(mappedBy ="courses")
private Set<Student> students = new HashSet<>();
注解说明:
@ManyToMany表示多对多关联,同样,可以在注解中指定级联关系
@JoinTable(name="值1", joinColumns=@JoinColumn(name= "值2") , inverseJoinColumns=@JoinColumn(name = "值3")
创建中间表,值1表示中键表名,值2表示当前对象中的那个值作为中间表的列,值3表示关联表那个列作为中间表的列
测试代码:
@SpringBootTest
class TestManyToMany {
@Autowired
private StudentRepository studentRepository;
@Test
void testAdd(){
Student student = new Student("张三");
Course course = new Course("javaEE");
Course course2 = new Course("javaSE");
student.getCourses().add(course);
student.getCourses().add(course2);
studentRepository.save(student);
}
}
通过控制台输入的SQL语句:
Hibernate: insert into student (stuname) values (?)
Hibernate: insert into course (cname) values (?)
Hibernate: insert into course (cname) values (?)
Hibernate: insert into student_course (stuid, cid) values (?, ?)
Hibernate: insert into student_course (stuid, cid) values (?, ?)