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;
}
最后生成的两张数据表