Код: Выделить всё
@Entity
@Table(name = "doctor")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Long.class)
@DynamicUpdate(value = true)
public class DoctorProfile implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 10)
private String gender;
@NotNull
@Column(unique = true, name = "phone_number", length = 15)
private String phoneNumber;
@Column(name = "specialization", length = 15)
private String specialization;
@Column(name = "avatar", length = 200)
private String avatar;
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "doctor_id", nullable = false)
private Doctor doctor;
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "clinic_id", nullable = false)
@JsonBackReference
private Clinic clinic;
//Getter-Setters omitted
}
Код: Выделить всё
public ResponseEntity updateDoctorProfile(DoctorProfile newInfo, long id){
DoctorProfile dc = doctorProfileRepository.findById(id).orElseThrow(
() -> new DoctorNotFoundException(id));
dc.setGender(newInfo.getGender());
dc.setPhoneNumber(newInfo.getPhoneNumber());
dc.setSpecialization(newInfo.getSpecialization());
dc.setClinic(newInfo.getClinic());
dc.setAvatar(newInfo.getAvatar());
final DoctorProfile updatedDoctor = doctorProfileRepository.save(dc);
return ResponseEntity.ok(updatedDoctor);
}
Код: Выделить всё
@RestController
Как видите, я пытался использовать аннотацию @DynamicUpdate, которая должна оставить неизменными все поля в @RequestBody, которые null, но у меня это не работает.
Я также думал о реализации логики, которая проверяет, являются ли поля нулевыми или нет в @RequestBody, и в конечном итоге заменяет их копирование значений из объекта, который я пытаюсь обновить. Но у этого решения есть две проблемы:
• Код выглядит грязным;
• Я не могу обновить значения, на которые ссылаются такие отношения, как @OneToOne через @RequestBody, например поля «Клиника» или «Доктор» в мой @Entity, поскольку я не передаю весь класс, а только идентификатор, и хотя этот подход работает в MySQL, он не работает в Spring JPA (и я все еще пытаюсь выяснить решение).
Я прочитал здесь несколько ответов о переполнении стека, и некоторые предложили создать методы, которые обновляют только одно поле за раз, поскольку именно так предполагается запрос HTTP.PUT. работать. Но действительно ли это хороший подход? Что делать, если у меня 100 200 или даже больше столбцов? Мне кажется это непрактичным и однообразным.
Подробнее здесь: https://stackoverflow.com/questions/660 ... web-reques