Поэтому я просмотрел различные руководства по JPA с данными Spring, и это неоднократно было сделано во многих случаях, и я не совсем уверен, что такое правильный подход.
Предположим, что существует следующее:
package stackoverflowTest.dao;
import javax.persistence.*;
@Entity
@Table(name = "customers")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;
@Column(name = "name")
private String name;
public Customer(String name) {
this.name = name;
}
public Customer() {
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
У нас также есть DTO, который извлекается на уровне сервиса, а затем передается на контроллер/клиентскую сторону.
package stackoverflowTest.dto;
public class CustomerDto {
private long id;
private String name;
public CustomerDto(long id, String name) {
this.id = id;
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Итак, теперь предположим, что Клиент хочет изменить свое имя в webui - тогда будет какое-то действие контроллера, где будет обновленный DTO со старым идентификатором и новым именем.
Теперь я должен сохранить этот обновленный DTO в базе данных.
К сожалению, в настоящее время нет способа обновить существующего клиента (кроме удаления записи в БД и создания нового Cusomter с новым автоматически сгенерированным идентификатором)
Однако, поскольку это не представляется возможным (особенно учитывая, что такая организация может иметь сотни отношений потенциально), - так что на мой взгляд идут два прямых решения:
- сделать установщик для идентификатора в классе Customer - и, таким образом, разрешить настройку идентификатора, а затем сохранить объект Customer через соответствующий репозиторий.
или же
- добавьте поле id в конструктор, и всякий раз, когда вы хотите обновить клиента, вы всегда создаете новый объект со старым id, но новые значения для других полей (в данном случае - только имя)
Итак, мой вопрос: существует ли общее правило, как это сделать? Возможно, какие-то недостатки двух методов, которые я объяснил?