Spring 启动并 mySQL 获取一对多关系的请求

Spring boot and mySQL get request for one to many relationship

我在 mySQL、用户、机构和角色

中有 3 个 table
  1. 用户与机构的一对多关系(一个用户可以在一个机构工作,一个机构可以有多个用户)

我的数据库中的机构已经插入,用户只能在特定的现有机构工作。

我为用户和机构手动添加了 2 条记录到我的数据库。

但是当我发送 getAllUsers 或 getAllInstitutions 请求时,我得到以下 json 正文,这是一个无限循环。

------------用户模型--------

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString

@Entity
@Table(name = "user")
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="user_Id")
    private int userId;
    @Column(name="name")
    private String name;
    @Column(name="lastname")
    private String lastname;
    @Column(name="email")
    private String email;
    @Column(name="password")
    private String password;
    @Column(name="isActive")
    private boolean isActive;
    @Column(name="lastActive")
    private String lastActive;
    @Column(name="createdDate")
    private String createdDate;
    @Column(name="isBlocked")
    private boolean isBlocked;
    
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "institution_id", nullable = false)
    private Institution institution;
    
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @JoinTable(name = "user_has_role",
            joinColumns = {
                    @JoinColumn(name = "user_id", referencedColumnName = "user_id",
                            nullable = false, updatable = true)},
            inverseJoinColumns = {
                    @JoinColumn(name = "role_id", referencedColumnName = "role_id",
                            nullable = false, updatable = true)})
    private Set<Role> roles = new HashSet<>();

}

--------机构模型------------

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString

@Entity
@Table(name = "institution")
public class Institution {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="institution_Id")
    private int institutionId;
    @Column(name="name")
    private String name;
    @Column(name="type")
    private String type;
    @Column(name="location")
    private String location;
    @OneToMany(mappedBy = "institution", fetch = FetchType.LAZY)
    private Set<User> user;
    
}

------------榜样---------

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString

@Entity
@Table(name = "role")
public class Role {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="role_Id")
    private int roleId;
    @Column(name="name")
    private String name;
    @Column(name="description")
    private String description;
    @ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY)
    private Set<User> users = new HashSet<>();

}

--------控制器------------

@GetMapping("/getAllUsers")
public List<User> getAllUsers() {
    return (List<User>) userrepository.findAll();
}

@PostMapping("/addUser")
public String addUser(@RequestBody User user) {
    userrepository.save(user);
    return "role saved with name: " + user.getName();
}

@GetMapping("/getAllInstitutions")
public List<Institution> getAllInstitutions() {
    return (List<Institution>) institutionrepository.findAll();
}

@PostMapping("/addInstitution")
public String addInstitution(@RequestBody Institution institution) {
    institutionrepository.save(institution);
    return "institution saved with name: " + institution.getName();
}

------------getAllInstitutions的api请求体循环错误----------------

[
{
    "institutionId": 1,
    "name": "Bank Byblos",
    "type": "Bank",
    "location": "sen el fil",
    "user": [
        {
            "userId": 3,
            "name": "user1",
            "lastname": "testtest",
            "email": "user1@hotmail.com",
            "password": "user1123",
            "lastActive": "11/11/21",
            "createdDate": "06/05/20",
            "institution": {
                "institutionId": 1,
                "name": "Bank Byblos",
                "type": "Bank",
                "location": "sen el fil",
                "user": [
                    {
                        "userId": 3,
                        "name": "user1",
                        "lastname": "testtest",
                        "email": "user1@hotmail.com",
                        "password": "user1123",
                        "lastActive": "11/11/21",
                        "createdDate": "06/05/20",
                        "institution": {
                            "institutionId": 1,
                            "name": "Bank Byblos",
                            "type": "Bank",
                            "location": "sen el fil",
                            "user": [
                                {
                                    "userId": 3,
                                    "name": "user1",
                                    "lastname": "testtest",
                                    "email": "user1@hotmail.com",
                                    "password": "user1123",
                                    "lastActive": "11/11/21",
                                    "createdDate": "06/05/20",
                                    "institution": {
                                        "institutionId": 1,
                                        "name": "Bank Byblos",
                                        "type": "Bank",
                                        "location": "sen el fil",
                                        "user": [
                                            {
                                                "userId": 3,
                                                "name": "user1",
                                                "lastname": "testtest",
                                                "email": "user1@hotmail.com",
                                                "password": "user1123",
                                                "lastActive": "11/11/21",
                                                "createdDate": "06/05/20",
                                                "institution": {
                                                    "institutionId": 1,
                                                    "name": "Bank Byblos",
                                                    "type": "Bank",
                                                    "location": "sen el fil",
                                                    "user": [
                                                        {
                                                            "userId": 3,
                                                            "name": "user1",
                                                            "lastname": "testtest",
                                                            "email": "user1@hotmail.com",
                                                            "password": "user1123",
                                                            "lastActive": "11/11/21",
                                                            "createdDate": "06/05/20",
                                                            "institution": {
                                                                "institutionId": 1,
                                                                "name": "Bank Byblos",
                                                                "type": "Bank",
                                                                "location": "sen el fil",
                                                                "user": [
                                                                    {
                                                                        "userId": 3,
                                                                        "name": "user1",
                                                                        "lastname": "testtest",
                                                                        "email": "user1@hotmail.com",
                                                                        "password": "user1123",
                                                                        "lastActive": "11/11/21",
                                                                        "createdDate": "06/05/20",
                                                                        "institution": {
                                                                            "institutionId": 1,
                                                                            "name": "Bank Byblos",
                                                                            "type": "Bank",
                                                                            "location": "sen el fil",
                                                                            "user": [
                                                                                {

------------getAllÙsers的api请求体循环错误----------------

[
{
    "userId": 3,
    "name": "user1",
    "lastname": "testtest",
    "email": "user1@hotmail.com",
    "password": "user1123",
    "lastActive": "11/11/21",
    "createdDate": "06/05/20",
    "institution": {
        "institutionId": 1,
        "name": "Bank Byblos",
        "type": "Bank",
        "location": "sen el fil",
        "user": [
            {
                "userId": 3,
                "name": "user1",
                "lastname": "testtest",
                "email": "user1@hotmail.com",
                "password": "user1123",
                "lastActive": "11/11/21",
                "createdDate": "06/05/20",
                "institution": {
                    "institutionId": 1,
                    "name": "Bank Byblos",
                    "type": "Bank",
                    "location": "sen el fil",
                    "user": [
                        {
                            "userId": 3,
                            "name": "user1",
                            "lastname": "testtest",
                            "email": "user1@hotmail.com",
                            "password": "user1123",
                            "lastActive": "11/11/21",
                            "createdDate": "06/05/20",
                            "institution": {
                                "institutionId": 1,
                                "name": "Bank Byblos",
                                "type": "Bank",
                                "location": "sen el fil",
                                "user": [
                                    {
                                        "userId": 3,
                                        "name": "user1",
                                        "lastname": "testtest",
                                        "email": "user1@hotmail.com",
                                        "password": "user1123",
                                        "lastActive": "11/11/21",
                                        "createdDate": "06/05/20",
                                        "institution": {
                                            "institutionId": 1,
                                            "name": "Bank Byblos",
                                            "type": "Bank",
                                            "location": "sen el fil",
                                            "user": [
                                                {
                                                    "userId": 3,
                                                    "name": "user1",
                                                    "lastname": "testtest",
                                                    "email": "user1@hotmail.com",
                                                    "password": "user1123",
                                                    "lastActive": "11/11/21",
                                                    "createdDate": "06/05/20",
                                                    "institution": {
                                                        "institutionId": 1,
                                                        "name": "Bank Byblos",
                                                        "type": "Bank",
                                                        "location": "sen el fil",
                                                        "user": [
                                                            {
                                                                "userId": 3,
                                                                "name": "user1",
                                                                "lastname": "testtest",
                                                                "email": "user1@hotmail.com",
                                                                "password": "user1123",
                                                                "lastActive": "11/11/21",
                                                                "createdDate": "06/05/20",
                                                                "institution": {
                                                                    "institutionId": 1,
                                                                    "name": "Bank Byblos",
                                                                    "type": "Bank",
                                                                    "location": "sen el fil",
                                                                    "user": [

我有2个用户添加到我的数据库 user1 和 user2 ,还有2个机构添加到我的数据库 user1 属于一个, user2 属于另一个(使用外键 institution_id in user table) 你能帮我解决一下吗?

尝试修改您的代码如下:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString

@Entity
@Table(name = "institution")
public class Institution {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="institution_Id")
    private int institutionId;
    @Column(name="name")
    private String name;
    @Column(name="type")
    private String type;
    @Column(name="location")
    private String location;

    @OneToMany(mappedBy = "institution", fetch = FetchType.LAZY)
    @JsonIgnoreProperties(value = {"institution"})
    private Set<User> user;
    
}

使用 @JsonIgnoreProperties 注释忽略 属性 用户在您的 Institution 模型中的设置。 现在不会循环了,因为获取机构数据时不会获取机构。

也尝试在您的 User 模型中添加 @JsonIgnoreProperties,它应该可以解决您的问题。

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString

@Entity
@Table(name = "user")
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="user_Id")
    private int userId;
    @Column(name="name")
    private String name;
    @Column(name="lastname")
    private String lastname;
    @Column(name="email")
    private String email;
    @Column(name="password")
    private String password;
    @Column(name="isActive")
    private boolean isActive;
    @Column(name="lastActive")
    private String lastActive;
    @Column(name="createdDate")
    private String createdDate;
    @Column(name="isBlocked")
    private boolean isBlocked;
    
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "institution_id", nullable = false)
    @JsonIgnoreProperties(value = {"user"})
    private Institution institution;
    
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)