【问题标题】:Spring boot and mySQL get request for one to many relationshipSpring boot和mySQL获取一对多关系的请求
【发布时间】:2020-12-06 10:26:00
【问题描述】:

我在 mySQL 中有 3 个表,用户、机构和角色

  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 中,并且添加到我的数据库 user1 的 2 个机构属于一个,而 user2 属于另一个(使用用户表中的外键机构 ID) 请问你能帮我修一下吗?

【问题讨论】:

    标签: java mysql spring-boot many-to-many postman


    【解决方案1】:

    尝试修改你的代码如下:

    @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)
    

    【讨论】:

    • 对于用户?我怎么知道用户在哪个机构工作,我现在就试试,谢谢..
    • 对于用户,请保持原样。它现在应该可以正常工作了。
    • 我试过它仍然给出相同的循环我猜它不应该是双向的?我应该从机构中删除这组用户吗? idk 其实
    • 对不起,我弄错了,我编辑了,这样试试。
    • 好的,它现在对机构有效,它为我提供了该机构用户的所有机构,但现在我得到一个错误 getAllUsers ` { "timestamp": "2020-08-17T10:01:21.921 +00:00”、“状态”:500、“错误”:“内部服务器错误”、“消息”:“”、“路径”:“/getAllUsers”}`
    猜你喜欢
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2022-01-05
    • 2023-04-10
    • 2017-10-28
    • 1970-01-01
    • 2019-01-24
    相关资源
    最近更新 更多