#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