Вы напрямую передаете объектные объекты hibernate / jpa через http или есть лучшая альтернатива?
Прежде всего, я хочу заявить, что я новичок в этой штуке с JPA / Hibernate, а также для меня в новинку micronaut (у меня большой опыт, например, в PHP, Python, "Desktop Java", C++ и так далее).
Я не могу избавиться от ощущения, что я что-то неправильно понимаю в концепции, когда я передаю объекты через аннотацию micronaut @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, вызов метода установки сущности). Есть ли "чистый" способ сделать это без переноса каждого свойства вручную (возможно, какая-нибудь библиотека на основе отражения или процессор аннотаций). Затем я мог бы загрузить сущность из контекста постоянства через идентификатор dto, а затем обновить свои поля сущности и запустить обновление.
В общем, мои проблемы: - Прямая передача сущностей приводит к отсоединению сущностей (так, например, пакет micronaut- data не может выполнять обновления таким образом) - Использование DTO заканчивается копированием свойства за свойством, что очень многословно
Итак, как правильно разместить объект через json на веб-сервере и сохранить или обновить его?
Если что-то непонятно, с радостью уточню!
2 ответа
В описанном вами подходе нет ничего плохого. Но вы должны знать, что делаете, вы связываете свой интерфейс отдыха с реализацией БД. В зависимости от ваших требований это, вероятно, будет проблемой. Например, если вашему приложению требуется оптимистический параллелизм, вам нужно будет добавить поле @Version в свою сущность, и вы автоматически предоставите эту информацию через веб-службу.
Как правило, вы хотите иметь контроль над открытыми данными, и обычно вы хотите отделить реализацию БД от остального API. И, кстати, обычно вы также хотите иметь объект домена с бизнес-логикой для проверки, бизнес-правилами...
Подход IMO DTO - это путь вперед при передаче данных на уровень пользовательского интерфейса из уровня постоянства. Попробуйте использовать копировщик сущностей Dozer (https://www.baeldung.com/dozer). Это поможет вам сократить количество шаблонного кода при копировании от одного объекта к другому.