【问题标题】:one to many relation ship in java spring bootjava spring boot中的一对多关系
【发布时间】:2023-04-10 10:53:02
【问题描述】:

我有 2 个表用户和机构,主键分别是 user_Id 和机构 ID。 尽管一个机构可以有多个用户,但每个用户只能在一个机构工作。 所以它是一对多的关系。 但是在我的 mySQL 数据库中,机构表有固定数量的用户可以工作的机构。 在我的用户表中有一个机构_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",
                            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;
    
}

-----控制器------ 这里我使用 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" : "jawadzakhour@hotmail.com",
    "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"
        }
    
}

...

【问题讨论】:

  • 到目前为止您尝试过什么?在保存用户时,您是否尝试过传递用户所在机构的institutionId? - 考虑机构是您的数据库中已经存在的主数据。
  • 我使用邮递员,所以是的,我尝试在我的 json 正文中添加所有用户字段以及机构字段,请给我一个例子@Sudoss
  • @jayee 当然可以。您能否使用您通过邮递员发送的 JSON 正文更新您的问题?另外,请确保您在数据库中为机构表插入了一些行。
  • 是的,我肯定会更新我的问题,是的,我的数据库@Sudoss 中有机构记录
  • 感谢您添加详细信息,请检查我的解决方案,如果您遇到任何问题,请告诉我们......

标签: java mysql spring-boot hibernate one-to-many


【解决方案1】:

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

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

那么你需要将下面的 JSON 作为请求传递

{
    "name" : "Jawad",
    "lastname" : "Zakhour",
    "email" : "jawadzakhour@hotmail.com",
    "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;

【讨论】:

  • 我能再问你一个问题吗?它是关于向用户添加角色......它是多对多的关系,我应该问一个新问题还是更新这个问题?谢谢
  • 最好提出一个新问题,如果你更新这个问题,答案可能会脱离上下文,对社区没有任何帮助。
  • 我问了一个新问题@Sudoss
猜你喜欢
  • 1970-01-01
  • 2021-04-13
  • 2020-07-04
  • 2019-01-24
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
相关资源
最近更新 更多