Как сопоставить ссылки на объекты в mapstruct с помощью JHipster?

Предположим, вы создаете приложение JHipster для блога с сообщениями, используя сценарий JDL, подобный этому, и хотите иметь BlogDTO, который отображает сообщения внутри него (и BlogDTO, который показывает комментарии, которые есть в каждом сообщении):

entity Blog {
    creationDate Instant required
    title String minlength(2) maxlength(100) required
}

entity Post {
    creationDate Instant required
    headline String minlength(2) maxlength(100) required
    bodytext String minlength(2) maxlength(1000) required
    image ImageBlob
}

entity Comment {
    creationDate Instant required
    commentText String minlength(2) maxlength(1000) required
}


// RELATIONSHIPS:
relationship OneToMany {
    Blog to Post{blog required}
    Post{comment} to Comment{post(headline) required}
}

// Set pagination options
paginate all with pagination

// DTOs for all
dto * with mapstruct

// Set service options to all except few
service all with serviceClass

// Filtering
filter *

Jhipster создаст ваши объекты Blog, Post и Comment с их DTO и сделает предположение, что вы не хотите заполнять блог сообщениями или сообщениями с комментариями, поэтому ваш BlogMapper будет выглядеть следующим образом:

@Mapper(componentModel = "spring", uses = {})
public interface BlogMapper extends EntityMapper<BlogDTO, Blog> {

    @Mapping(target = "posts", ignore = true)
    Blog toEntity(BlogDTO blogDTO);


    default Blog fromId(Long id) {
        if (id == null) {
            return null;
        }
        Blog blog = new Blog();
        blog.setId(id);
        return blog;
    }
}

с таким BlogDTO:

public class BlogDTO implements Serializable {

    private Long id;

    @NotNull
    private Instant creationDate;

    @NotNull
    @Size(min = 2, max = 100)
    private String title;
//GETTERS, SETTERS, HASHCODE, EQUALS & TOSTRING

Может ли кто-нибудь помочь изменить код, чтобы BlogDTO отображал сообщения (а PostDTO отображал комментарии). Спасибо

PD: Потому что я изменил аннотацию, включив в нее класс PostMapper. @Mapper (componentModel = "spring", uses = {PostMapper.class})

И @Mapping (target = "posts", ignore = false) на FALSE, но это не работает. Пример API (Swagger) выглядит нормально, но тогда PostDTO имеет значение null (даже если данные есть).

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 696
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавьте Set<PostDTO> posts; в свой BlogDTO и Set<CommentDTO> comments; в свой PostDTO. Также добавьте геттеры и сеттеры для этих полей в файлы DTO. Затем в ваших картографах убедитесь, что BlogMapper использует PostMapper, а PostMapper использует CommentMapper.

Вам также может потребоваться настроить аннотации кеширования в поле posts в Blog.java и поле comments в Post.java в соответствии с вашим вариантом использования. С NONSTRICT_READ_WRITE может возникнуть задержка в обновлении кеша, что приведет к устаревшим данным, возвращаемым API.

Поэтому, если у вас возникнет задержка, @Cache (usage = CacheConcurrencyStrategy.NONE) и будет работать. Вы можете проверить это: github.com/ruddell/jhipster-examples/commit/… и не забудьте изменить ToString в сообщении и комментарии, чтобы увидеть результаты в API (или вы получите пустой массив). Спасибо, Джон.

Mike 31.07.2018 10:30

Некоторая информация о @Cache на случай, если она вам понадобится для понимания проблемы: baeldung.com/hibernate-second-level-cache

Mike 31.07.2018 12:06

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