Вы напрямую передаете объектные объекты 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). Это поможет вам сократить количество шаблонного кода при копировании от одного объекта к другому.

Другие вопросы по тегам