Java Spring Data JPA postgres 不正确的关联,嵌套响应

问题描述 投票:0回答:1

我正在使用 Java Spring Data JPA 来实现 Postgres 数据库的 ORM,
以下是我的用例 -
表是 app_user、idcard、role、contact 和 application。

其中 1 个 app_user 只能拥有 1 个身份证,
1个app_user可以有1个角色,但是一个角色可以关联多个app_user,

一个app_user可以有多个联系人

多个app_user可以关联多个应用程序,
一个应用程序可以关联多个app_user。

ERD 看起来像这样 -
enter image description here


实体类看起来像 -
app_user table -

@Getter
@Setter
@Entity
@Table(name = "app_user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    private IDCard idCard;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<Contact> contacts = new HashSet<>();

    @ManyToMany
    @JoinTable(
            name = "user_application",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "application_id")
    )
    private Set<Application> applications = new HashSet<>();

    @ManyToOne
    @JoinColumn(name = "role_id")
    private Role role;
}


idcard table -

@Getter
@Setter
@Entity
@Table(name = "idcard")
public class IDCard {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "id_number")
    private String idNumber;

    @OneToOne
    @JoinColumn(name = "user_id")
    private User user;
}


contact table -
@Getter
@Setter
@Entity
@Table(name = "contact")
public class Contact {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "phone_number")
    private String phoneNumber;

    private String email;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}

role table -

@Getter
@Setter
@Entity
@Table(name = "role")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToMany(mappedBy = "role")
    private Set<User> users = new HashSet<>();
}


application table -

@Getter
@Setter
@Entity
@Table(name = "application")
public class Application {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToMany(mappedBy = "applications")
    private Set<User> users = new HashSet<>();
}

当我运行 springboot 应用程序时,我得到嵌套结果,
似乎表结构或关联不正确,我做错了什么?

enter image description here

postgresql spring-boot spring-data-jpa
1个回答
0
投票

使用 @JsonManagedReference@JsonBackReference:

  • @JsonManagedReference 用于关系的父端。
  • @JsonBackReference 用于子端,以打破递归。

例如,在您的 User 和 IDCard 类中:

@OneToOne(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    @JsonManagedReference
    private IDCard idCard;

 @OneToOne
    @JoinColumn(name = "user_id")
    @JsonBackReference
    private User user;

或者在IDCard类中使用@JsonIgnore

@OneToOne
@JoinColumn(name = "user_id")
@JsonIgnore
private User user;
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.