1、@OneToOne 一对一关联查询

假设一个部门里面的每个人都有一个唯一确定的职位,那么职位和人之间就是一对一的关系

2、代码

User.java

  1. package com.ctguyxr.satokendemo.entity;
  2. import com.fasterxml.jackson.annotation.JsonIgnore;
  3. import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  4. import com.fasterxml.jackson.annotation.JsonProperty;
  5. import lombok.Data;
  6. import org.hibernate.annotations.Proxy;
  7. import javax.persistence.*;
  8. import java.util.List;
  9. /**
  10. * Created By Intellij IDEA
  11. *
  12. * @author Xinrui Yu
  13. * @date 2021/11/28 11:57 星期日
  14. */
  15. @Entity
  16. @Data
  17. @Table(name = "t_users")
  18. @JsonIgnoreProperties(value = {"hibernateLazyInitializer"})
  19. public class User {
  20. @Id
  21. @GeneratedValue(strategy = GenerationType.IDENTITY)
  22. private Integer id;
  23. private String name;
  24. @JsonProperty(value = "pwd")
  25. private String password;
  26. @OneToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
  27. @JoinColumn(name = "role_id",referencedColumnName = "id")
  28. private Role role;
  29. @ManyToMany(fetch = FetchType.EAGER)
  30. @JoinTable(name = "user_permissions")
  31. private List<Permissions> permissions;
  32. }

Role.java

  1. package com.ctguyxr.satokendemo.entity;
  2. import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  3. import lombok.Data;
  4. import javax.persistence.*;
  5. /**
  6. * Created By Intellij IDEA
  7. *
  8. * @author Xinrui Yu
  9. * @date 2021/11/28 12:50 星期日
  10. */
  11. @Entity
  12. @Data
  13. @Table(name = "t_roles")
  14. @JsonIgnoreProperties(value = {"hibernateLazyInitializer"})
  15. public class Role {
  16. @Id
  17. @GeneratedValue(strategy = GenerationType.IDENTITY)
  18. private Integer id;
  19. private String name;
  20. }

3、查询结果:

  1. {
  2. "code": 5000,
  3. "msg": "success",
  4. "status": "ok",
  5. "data": {
  6. "id": 4,
  7. "name": "4782478",
  8. "role": {
  9. "id": 1,
  10. "name": "regular_user"
  11. },
  12. "permissions": [
  13. {
  14. "id": 1,
  15. "name": "add"
  16. },
  17. {
  18. "id": 2,
  19. "name": "delete"
  20. },
  21. {
  22. "id": 3,
  23. "name": "update"
  24. },
  25. {
  26. "id": 4,
  27. "name": "get"
  28. }
  29. ],
  30. "pwd": "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3"
  31. }
  32. }

4、注解中相应属性的作用

@OneToOne注解

cascade: 关联属性,这个属性定义了当前类对象操作了之后,级联对象的操作。本例中定义了:CascadeType.ALL,当前类增删改查改变之后,关联类跟着增删改查。
fetch属性:FetchType类型的属性。可选择项包括:FetchType.EAGER 和FetchType.LAZY。 FetchType.EAGER表示关系类(本例是OrderItem类)在主类加载的时候同时加载,FetchType.LAZY表示关系类在被访问时才加载。默认值是FetchType.LAZY。
mappedBy:拥有关联关系的域,如果关系是单向的就不需要,双向关系表,那么拥有关系的这一方有建立、解除和更新与另一方关系的能力,而另一方没有,只能被动管理,这个属性被定义在关系的被拥有方。
双向@OneToOne,双向@OneToMany,双向@ManyToMany

mappedBy详解

普通情况下定义双向关系,那么最后生成数据表的时候会生成两张数据表,比如
image.png
来表示学生和班级之间的对应关系,以及班级和学生之间的这种双向的对应关系

但是有的时候我们想在这种双向关系的同时,把数据的控制权交给一方
比如城市和大学,我们想把大学的控制权交给城市,这样的话就可以不用创建两张表来维护
通过大学查城市和通过城市查大学都是查的同一张表

City.java

  1. package com.ctguyxr.satokendemo.entity;
  2. import com.fasterxml.jackson.annotation.JsonBackReference;
  3. import com.fasterxml.jackson.annotation.JsonManagedReference;
  4. import lombok.Data;
  5. import javax.persistence.*;
  6. import java.util.List;
  7. /**
  8. * Created By Intellij IDEA
  9. *
  10. * @author Xinrui Yu
  11. * @date 2021/11/28 20:59 星期日
  12. */
  13. @Entity
  14. @Data
  15. @Table(name = "t_city")
  16. public class City {
  17. @Id
  18. @GeneratedValue(strategy = GenerationType.IDENTITY)
  19. private Integer id;
  20. private String name;
  21. @JsonManagedReference
  22. @OneToMany(cascade = CascadeType.ALL)
  23. @JoinColumn(name = "city_id")
  24. private List<College> colleges;
  25. }

College.java

  1. package com.ctguyxr.satokendemo.entity;
  2. import com.fasterxml.jackson.annotation.JsonBackReference;
  3. import com.fasterxml.jackson.annotation.JsonIgnore;
  4. import com.fasterxml.jackson.annotation.JsonManagedReference;
  5. import lombok.Data;
  6. import javax.persistence.*;
  7. import javax.persistence.criteria.CriteriaBuilder;
  8. import java.util.List;
  9. /**
  10. * Created By Intellij IDEA
  11. *
  12. * @author Xinrui Yu
  13. * @date 2021/11/28 21:00 星期日
  14. */
  15. @Entity
  16. @Data
  17. @Table(name = "t_colleges")
  18. public class College {
  19. @Id
  20. @GeneratedValue(strategy = GenerationType.IDENTITY)
  21. private Integer id;
  22. private String name;
  23. @JsonBackReference
  24. @ManyToOne(cascade = CascadeType.ALL)
  25. private City city;
  26. }

最后生成的两张数据表
image.pngimage.png