Java Orika Mapper

172
02 ноября 2021, 01:00

Здраствуйте. У меня есть PostEntity, PostDto и есть OrikaMapper.

package com.egsians.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PostDto {
    private Long id;
    private Long userId;
    private String text;
    private Date date;
    private List<HashTagDto> hashTags;
    private List<ImageDto> images;
}
package com.egsians.model;
import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.util.Date;
import java.util.List;
@Data
@Entity
@Table(name = "posts", indexes = {
        @Index(name = "posts_id_IDX", columnList = "id"),
        @Index(name = "posts_user_id_IDX", columnList = "user_id")
})
public class PostEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "user_id")
    private UserEntity user;
    @Column(name = "text", nullable = false, length = 1000)
    private String text;
    @CreationTimestamp
    private Date date;
    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "post_id")
    private List<ImageEntity> images;
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "posts_hash_tags",
            joinColumns = @JoinColumn(name = "post_id"),
            inverseJoinColumns = @JoinColumn(name = "hash_tag_id")
    )
    private List<HashTagEntity> hashTags;
}


 package com.egsians.mapper;
import com.egsians.dto.HashTagDto;
import com.egsians.dto.ImageDto;
import com.egsians.dto.PostDto;
import com.egsians.model.PostEntity;
import com.egsians.model.UserEntity;
import com.egsians.repository.UserRepository;
import ma.glasnost.orika.CustomMapper;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.MappingContext;
import ma.glasnost.orika.impl.ConfigurableMapper;
import org.springframework.stereotype.Component;
import java.util.Optional;
import java.util.stream.Collectors;
@Component
public class PostMapper extends ConfigurableMapper {
    private final UserRepository userRepo;
    private final HashTagMapper hashTagMapper;
    private final ImageMapper imageMapper;
    public PostMapper(UserRepository userRepo,
                      HashTagMapper hashTagMapper,
                      ImageMapper imageMapper) {
        this.userRepo = userRepo;
        this.hashTagMapper = hashTagMapper;
        this.imageMapper = imageMapper;
    }
    @Override
    protected void configure(MapperFactory factory) {
        factory.classMap(PostEntity.class, PostDto.class)
               .customize(new CustomMapper<PostEntity, PostDto>() {
                   @Override
                   public void mapAtoB(PostEntity postEntity, PostDto postDto, MappingContext context) {
                       postDto.setUserId(postEntity.getUser().getId());
                       postDto.setId(postEntity.getId());
                       postDto.setDate(postEntity.getDate());
                       postDto.setText(postEntity.getText());
                       postDto.setHashTags(postEntity.getHashTags()
                               .stream().map(hashTag -> hashTagMapper.map(hashTag, HashTagDto.class))
                               .collect(Collectors.toList()));
                       postDto.setImages(postEntity.getImages()
                               .stream().map(image -> imageMapper.map(image, ImageDto.class))
                               .collect(Collectors.toList()));
                   }
               })
                .register();
        factory.classMap(PostDto.class, PostEntity.class)
                .field("id", "id")
                .field("text", "text")
                .field("date", "date")
                .field("hashTags", "hashTags")
                .field("images", "images")
                .byDefault()
                .customize(new CustomMapper<PostDto, PostEntity>() {
                    @Override
                    public void mapAtoB(PostDto postDto, PostEntity postEntity, MappingContext context) {
                        Optional<UserEntity> optionalUser = userRepo.findById(postDto.getUserId());
                        optionalUser.ifPresent(postEntity::setUser);
                    }
                }).register();
    }
}

Когда вызываю метод postMapper.map(postEntity,PostDto.class), он мне выдает результат, в котором поле userId всегда null. Можно ли как нибудь исправить?

Answer 1

В PostMapper есть класс CustomMapper, а в нем метод mapAToB. Так как я работаю с Spring Boot-ом, мне помог аннотатия @Transactional(readOnly = true), поставленный перед методом mapAToB.

READ ALSO
Java: вывести слова из текста в алфавитном порядке

Java: вывести слова из текста в алфавитном порядке

Есть массив со словами, как вывести слова в массиве по алфавиту и посчитать сколько одинаковых слов, например:

221
Ошибка инициализации MySQL 8.0

Ошибка инициализации MySQL 8.0

Помогите, пожалуйста, запустить mySql 80 Файл my

194
Как сделать чтобы подзапрос с агрегацией отрабатывал построчно для группировки?

Как сделать чтобы подзапрос с агрегацией отрабатывал построчно для группировки?

Есть таблица постов post от пользователей такого вида:

98
Амперсанд в регулярном выражении mysql?

Амперсанд в регулярном выражении mysql?

Подскажите как заставить работать следующий запрос:

161