Прежде всего, я хочу сказать, что я довольно новичок в этой области JPA / Hibernate, а также для меня новичок в микронавигации (у меня есть большой опыт, например, в PHP, Python, "Desktop Java", C ++ и так далее). ).
Я не могу избавиться от ощущения, что я что-то неправильно понимаю в концепции, когда я передаю сущности через микронавт аннотации @Body, когда они появляются отдельно, и мне приходится объединять их в постоянствоконтекст вручную, используя em.merge(entity)
.
Пожалуйста, рассмотрите следующий пример (сокращенный, чтобы просто показать важные части):
MyEntity.java:
import javax.persistence.*;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Entity
@Table(name = "entities")
@Getter
@Setter
@ToString
public class Entity{
@Id
@Column
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column
protected String name;
}
MyController.java:
import io.micronaut.http.HttpResponse;
import io.micronaut.http.annotation.*;
@Controller("/entities")
public class EntitiyCrudController {
@Inject
private final EntityManager entityManager;
@Post("/create")
public HttpResponse create(@Body Entity entity) {
try {
entity = entityManager.merge(entity);
return HttpResponse.ok(entity);
} catch (ConstraintViolationException exception) {
return HttpResponse.badRequest();
}
}
}
Обратите внимание, что образцы просто скопированы вместе, поэтому могут быть некоторые ошибки, но я думаю, что это больше вопрос о правильном подходе к выбору.
Во время моего исследования все примеры, которые я видел до сих пор, касаются сохраняющихся сущностей, которые не отделены. Иногда я видел людей, использующих DTO (точные копии классов сущностей на уровне свойств, но без аннотаций jpa / hibernate). Я думаю, что этот подход также имеет некоторый запах, так как мне нужно создать совершенно новый класс, который обладает точно такими же свойствами.
У меня не было бы больших проблем с использованием DTO, если бы не было передачи свойствdto к объекту (вызывающий dto getter, вызывающий entity setter). Есть ли «чистый» способ сделать это без переноса каждого свойства вручную (может быть, какая-то библиотека на основе отражений или процессор аннотаций). Затем я мог бы загрузить сущность из контекста постоянства с помощью идентификатора dto, а затем обновить поля моей сущности и запустить обновление.
В итоге мои проблемы заключаются в следующем: - Прямая передача сущностей приводит к отсоединению сущностей (такнапример, пакет данных microronaut не может обновлять таким образом) - Используя DTO, вы заканчиваете копированием свойства по свойству, которое очень многословно
Так что это правильный способ отправки объекта через json на веб-сервер и сохранения илиобновлять его?
Если что-то не понятно, я с удовольствием уточню!