首页 > 解决方案 > 具有 OneToMany 关系并希望使用 DTO 的 JPA 实体

问题描述

我有一个名为“Review”的实体,它与“User”实体具有 OneToOne 关系,与“ReviewStage”实体具有 OneToMany 关系。我已经实现了 DTO 模式,所以我也有 ReviewDTO,它实际上是发送到 UI 的内容。我正在使用 mapstruct 将实体映射到 dto。一切运行良好,但我宁愿在关系映射中使用 UserDTO 和 ReviewStageDTO。

这很好用:

@Entity
@Getter @Setter @NoArgsConstructor
public class Review {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long reviewId;
    
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "ownerId")
    private User owner;

    @OneToMany(mappedBy = "reviewId")
    private Set<ReviewStage> stages;

}

为了好玩,我尝试了这个,但显然不起作用:

@Entity
@Getter @Setter @NoArgsConstructor
public class Review {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long reviewId;
    
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "ownerId")
    private UserDTO owner;

    @OneToMany(mappedBy = "reviewId")
    private Set<ReviewStageDTO> stages;

}

我只需要朝着正确的方向轻推。谢谢,

标签: javaspring-boothibernatejpamapstruct

解决方案


relationships应该在only 之间,entities如果你想创建一个dtoforReview并且在这个里面dto你想返回UserDto例如你应该创建一个在tomapstruct class之间映射UserEntityUserDTO

例子

class UserDto {
    /// put any fields here that you want to map
}

class ReviewDto {
    UserDto user;
}

@Mapper(componentModel = "spring")
class UserMapper {
    UserDto map(User user);
}

@Mapper(componentModel = "spring", uses={UserMapper.class})
class ReviewMapper {
    ReviewDto map(Review review);
}

推荐阅读