Вы напрямую передаете объектные объекты hibernate / jpa через http или есть лучшая альтернатива? - PullRequest
1 голос
/ 11 октября 2019

Прежде всего, я хочу сказать, что я довольно новичок в этой области 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 на веб-сервер и сохранения илиобновлять его?

Если что-то не понятно, я с удовольствием уточню!

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Подход IMO DTO - это способ продвижения данных при передаче данных на уровень пользовательского интерфейса со слоя постоянства. Попробуйте использовать копировальный аппарат Dozer (https://www.baeldung.com/dozer).. Это поможет вам сократить объем кода, используемого при копировании, из одной сущности в другую.

0 голосов
/ 11 октября 2019

Подход, который вы описываете, сам по себе не имеет ничего плохого. Но вы должны знать, что вы делаете, вы связываете свой интерфейс отдыха с вашей реализацией БД. Зависит от ваших требований, это, вероятно, будет проблемой. Например, если вашему приложению требуется оптимистический параллелизм, вам нужно добавить поле @Version в вашей сущности, и вы автоматически предоставите эту информацию через веб-сервис.

Как правило, вы хотите контролировать данныеэто раскрывается, и, как правило, вы хотите отделить реализацию БД остальных API. И, кстати, как правило, вы также хотите иметь объект домена с бизнес-логикой для проверки, бизнес-правил ...

...