Java Spring Boot中的一对多关系

问题描述

我有2个表Users和Institution,主键分别为user_Id和stitution_id。 每个用户只能在一个机构中工作,尽管一个机构可以有许多用户。 因此它是一对多的关系。 但是在我的MysqL db中,机构表具有用户可以在其中工作的固定数量的机构。 我的用户表中有一个stitution_Id的外键,用于指定他在哪个机构工作。 在使用rest api添加用户时,我无法指定他在哪个机构工作

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

@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",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;
    
}

------控制器------ 这里我使用api添加用户...

@GetMapping("/getAllUsers")
    public List<User> getAllUsers() {
        return (List<User>) userrepository.findAll();
    }
    
    @PostMapping("/addUser")
    public String addUser(@RequestBody User user) {
        userrepository.save(user);
        return "user saved with name: " + user.getName();
    }

有办法吗?

-------- api请求---------

{
    "name" : "Jawad","lastname" : "Zakhour","email" : "[email protected]","password" : "jawad123","isActive" : 0,"lastActive" : "13/08/2020","createdDate" : "07/07/2020","isBlocked" : 0,"institution" : 
        {
            "name" : "maliks","type" : "Merchant","location" : "Le mall sen el fil"
        }
    
}

...

解决方法

感谢您添加详细信息。 您可以通过传递institution表的主键(对应记录的institution_Id)来实现相同的目的。

例如-如果您希望将用户Jawad链接到机构maliks,那么您的institution表应该已插入一行,其值为maliks,Merchant,Le mall sen el fil分别用于nametypelocation列。 (我假设此Recod在您的数据库中有institution_Id = 1)

然后您需要根据请求传递以下JSON

{
    "name" : "Jawad","lastname" : "Zakhour","email" : "[email protected]","password" : "jawad123","isActive" : 0,"lastActive" : "13/08/2020","createdDate" : "07/07/2020","isBlocked" : 0,"institution" : 
        {
            "institutionId" : 1  // As per my assumption stated above
        }
    
}

您需要确保的另一件事是您的User模型具有如下所示的层叠设置

    @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY,optional = false)
    @JoinColumn(name = "institution_id",nullable = false)
    private Institution institution;