передача отношений «один ко многим» при загрузке java spring

#java #mysql #spring-boot #hibernate #one-to-many

#java #mysql #spring-boot #переход в спящий режим #один ко многим

Вопрос:

У меня есть 2 таблицы Users и Institution, с первичными ключами соответственно user_Id и institution_id. Каждый пользователь работает в одном и только одном учреждении, хотя в учреждении может быть много пользователей. таким образом, это связь «один ко многим». Но в моей базе данных MySQL таблица учреждений содержит фиксированное количество учреждений, в которых пользователь может работать. в моей пользовательской таблице есть внешний ключ institution_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"
        }
    
}
  

Комментарии:

1. Что вы уже пробовали? При сохранении пользователя вы пробовали передавать institutionId учреждения, в котором работает пользователь? — Учитывая, что Institution — это основные данные, уже присутствующие в вашей базе данных.

2. Я использую postman, так что да, я пытался добавить все в свое тело json, все поля пользователя плюс поля учреждения, не могли бы вы, пожалуйста, привести мне пример, пожалуйста @Sudoss

3. @jayee уверен, что смогу. Не могли бы вы, пожалуйста, обновить свой вопрос с помощью тела JSON, которое вы отправляете через postman? Также, пожалуйста, убедитесь, что у вас есть несколько строк, вставленных для таблицы institution в вашей базе данных.

4. да, конечно, я обновлю свой вопрос, и да, в моей базе данных есть записи в учреждениях @Sudoss

5. Спасибо за добавление деталей, пожалуйста, проверьте мое решение и дайте нам знать, если у вас возникнут какие-либо проблемы….

Ответ №1:

Спасибо за добавление деталей. Вы можете достичь того же, передав первичный ключ institution таблицы, которая является institution_Id для соответствующей записи.

Например, если вы хотите, чтобы пользователь Jawad был связан с учреждением maliks , то в вашей institution таблице уже должна быть вставлена строка со значениями как maliks, Merchant, Le mall sen el fil для name , type и location столбцов соответственно. (Я предполагаю, что этот recod имеет 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;
  

Комментарии:

1. могу я задать вам еще один вопрос? речь идет о добавлении роли пользователю… это связь «многие ко многим» должен ли я задать новый вопрос или обновить этот? Спасибо

2. Всегда лучше задать новый вопрос, если вы обновите этот вопрос, ответ может выглядеть вырванным из контекста, и это никоим образом не поможет сообществу.

3. я задал новый вопрос @Sudoss