1、@OneToOne 一对一关联查询
假设一个部门里面的每个人都有一个唯一确定的职位,那么职位和人之间就是一对一的关系
2、代码
User.java
package com.ctguyxr.satokendemo.entity;import com.fasterxml.jackson.annotation.JsonIgnore;import com.fasterxml.jackson.annotation.JsonIgnoreProperties;import com.fasterxml.jackson.annotation.JsonProperty;import lombok.Data;import org.hibernate.annotations.Proxy;import javax.persistence.*;import java.util.List;/*** Created By Intellij IDEA** @author Xinrui Yu* @date 2021/11/28 11:57 星期日*/@Entity@Data@Table(name = "t_users")@JsonIgnoreProperties(value = {"hibernateLazyInitializer"})public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String name;@JsonProperty(value = "pwd")private String password;@OneToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)@JoinColumn(name = "role_id",referencedColumnName = "id")private Role role;@ManyToMany(fetch = FetchType.EAGER)@JoinTable(name = "user_permissions")private List<Permissions> permissions;}
Role.java
package com.ctguyxr.satokendemo.entity;import com.fasterxml.jackson.annotation.JsonIgnoreProperties;import lombok.Data;import javax.persistence.*;/*** Created By Intellij IDEA** @author Xinrui Yu* @date 2021/11/28 12:50 星期日*/@Entity@Data@Table(name = "t_roles")@JsonIgnoreProperties(value = {"hibernateLazyInitializer"})public class Role {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String name;}
3、查询结果:
{"code": 5000,"msg": "success","status": "ok","data": {"id": 4,"name": "4782478","role": {"id": 1,"name": "regular_user"},"permissions": [{"id": 1,"name": "add"},{"id": 2,"name": "delete"},{"id": 3,"name": "update"},{"id": 4,"name": "get"}],"pwd": "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3"}}
4、注解中相应属性的作用
@OneToOne注解
cascade: 关联属性,这个属性定义了当前类对象操作了之后,级联对象的操作。本例中定义了:CascadeType.ALL,当前类增删改查改变之后,关联类跟着增删改查。
fetch属性:FetchType类型的属性。可选择项包括:FetchType.EAGER 和FetchType.LAZY。 FetchType.EAGER表示关系类(本例是OrderItem类)在主类加载的时候同时加载,FetchType.LAZY表示关系类在被访问时才加载。默认值是FetchType.LAZY。
mappedBy:拥有关联关系的域,如果关系是单向的就不需要,双向关系表,那么拥有关系的这一方有建立、解除和更新与另一方关系的能力,而另一方没有,只能被动管理,这个属性被定义在关系的被拥有方。
双向@OneToOne,双向@OneToMany,双向@ManyToMany
mappedBy详解
普通情况下定义双向关系,那么最后生成数据表的时候会生成两张数据表,比如
来表示学生和班级之间的对应关系,以及班级和学生之间的这种双向的对应关系
但是有的时候我们想在这种双向关系的同时,把数据的控制权交给一方
比如城市和大学,我们想把大学的控制权交给城市,这样的话就可以不用创建两张表来维护
通过大学查城市和通过城市查大学都是查的同一张表
City.java
package com.ctguyxr.satokendemo.entity;import com.fasterxml.jackson.annotation.JsonBackReference;import com.fasterxml.jackson.annotation.JsonManagedReference;import lombok.Data;import javax.persistence.*;import java.util.List;/*** Created By Intellij IDEA** @author Xinrui Yu* @date 2021/11/28 20:59 星期日*/@Entity@Data@Table(name = "t_city")public class City {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String name;@JsonManagedReference@OneToMany(cascade = CascadeType.ALL)@JoinColumn(name = "city_id")private List<College> colleges;}
College.java
package com.ctguyxr.satokendemo.entity;import com.fasterxml.jackson.annotation.JsonBackReference;import com.fasterxml.jackson.annotation.JsonIgnore;import com.fasterxml.jackson.annotation.JsonManagedReference;import lombok.Data;import javax.persistence.*;import javax.persistence.criteria.CriteriaBuilder;import java.util.List;/*** Created By Intellij IDEA** @author Xinrui Yu* @date 2021/11/28 21:00 星期日*/@Entity@Data@Table(name = "t_colleges")public class College {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String name;@JsonBackReference@ManyToOne(cascade = CascadeType.ALL)private City city;}
最后生成的两张数据表

