jpa是一个实体,它有一个one-omany关系并希望使用dto

nzk0hqpo  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(315)

我有一个名为“review”的实体,它与“user”实体有一个one关系,与“reviewstage”实体有一个one关系。我已经实现了一个dto模式,所以,我也有reviewdto,它实际上是发送到ui的内容。我使用mapstruct将实体Map到dto。一切都很好,但是,我宁愿在关系Map中使用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;

}

我只需要往正确的方向推一下。谢谢,

pokxtpni

pokxtpni1#

如果您关心性能,我可以建议您看看blaze持久性实体视图提供了什么。
我创建了这个库,以便在jpa模型和自定义接口或抽象类定义的模型之间进行简单的Map,比如spring数据在steroids上的投影。其思想是以您喜欢的方式定义目标结构(域模型),并通过jpql表达式将属性(getter)Map到实体模型。
对于blaze持久性实体视图,用例的dto模型可以如下所示:

@EntityView(Review.class)
public interface ReviewDTO {
    @IdMapping
    Long getReviewId();
    UserDTO getOwner();
    Set<ReviewStageDTO> getStages();

    @EntityView(User.class)
    interface UserDTO {
        @IdMapping
        Long getId();
        String getName();
    }

    @EntityView(ReviewStage.class)
    interface ReviewStageDTO {
        @IdMapping
        Long getId();
        String getName();
    }
}

查询是将实体视图应用于查询的问题,最简单的就是按id进行查询。 ReviewDTO a = entityViewManager.find(entityManager, ReviewDTO.class, id); spring数据集成允许您像spring数据投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_us/index.html#spring-数据特征

Optional<ReviewDTO> findByReviewId(long reviewId);

请注意,这将只获取实际需要的状态。使用mapstruct或其他beanMap解决方案,您必须自己处理有效的获取。

zpjtge22

zpjtge222#

这个 relationships 应该介于 entities 如果你想做一个 dto 为了 Review 在这里面呢 dto 你想退票吗 UserDto 例如,您应该创建 mapstruct class Map 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);
}

相关问题