I have an entity called “Review” that has a OneToOne relationship with a “User” entity and a OneToMany relationship with a “ReviewStage” entity. I have implemented a DTO pattern so, I also have ReviewDTO which is actually what is being sent to the UI. I am using mapstruct to map the entity to dto. All is working well however, I would rather use the UserDTO and ReviewStageDTO in the relationship mappings.
This works well:
@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; }
For fun, I tried this but, obviously doesn’t work:
@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; }
I just need a nudge in the right direction. Thanks,
Advertisement
Answer
The relationships
should be between entities
only and if you want to make a dto
for Review
and inside this dto
you want to return the UserDto
for example you should create a mapstruct class
to map between UserEntity
to UserDTO
Example
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); }