▸ 오늘의 코드카타
▸ "detached entity passed to persist" 해결
▸ 내 프로필 조회 기능 구현 (이어서)
2024년 2월 27일 - [프로그래머스 - 자바(JAVA)] 31 : 프로세스
InvalidDataAccessApiUsageException: detached entity passed to persist
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EntityListeners(AuditingEntityListener.class)
@Table(name = "TB_POST")
public class PostEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long postId;
...
@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.PERSIST)
@JoinColumn(name = "user_id")
@OnDelete(action = OnDeleteAction.CASCADE)
private UserEntity userEntity;
public PostEntity(PostRequestDto requestDto, UserEntity entity) {
this.title = requestDto.getTitle();
this.content = requestDto.getContent();
this.views = 0L;
this.userEntity = entity;
}
}
@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.PERSIST)
여기서 cascade = CascadeType.PERSIST
때문에 오류가 발생했다.cascade = CascadeType.PERSIST
는 JPA에서 관계를 관리할 때 사용되는 설정 중 하나이다. 이 설정은 엔티티 간의 관계가 영속성 컨텍스트에서 동일한 영속성 상태를 갖도록 하는 방법을 지정한다.PERSIST
는 연관된 엔티티를 영속 상태로 만들 때 연관 엔티티도 함께 영속화한다. 따라서 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장됩니다.cascade = CascadeType.PERSIST
이 설정을 삭제하면 된다.private final UserRepository userRepository;
private final PostRepository postRepository;
private final CommentRepository commentRepository;
private final FollowRepository followRepository;
...
public ProfileResponseDto getProfile(User user) {
ProfileResponseDto profileResponseDto = user.profileResponseDto();
profileResponseDto.setMyPosts(getPostResponseDtoListBy(user));
profileResponseDto.setMyComments(getCommentResponseDtoListBy(user));
profileResponseDto.setMyFollowers(getFollowerListBy(user));
return profileResponseDto;
}
...
public List<GetPostResponseDto> getPostResponseDtoListBy(User user) {
return postRepository
.findByUserEntityUserId(user.toEntity().getUserId()).stream()
.filter(Objects::nonNull)
.map(GetPostResponseDto::new)
.collect(Collectors.toList());
}
public List<CommentResponseDto> getCommentResponseDtoListBy(User user) {
return commentRepository
.findByUserEntityUserId(user.toEntity().getUserId()).stream()
.filter(Objects::nonNull)
.map(CommentResponseDto::new)
.collect(Collectors.toList());
}
public List<GetProfileResponseDto> getFollowerListBy(User user) {
return followRepository.findAllByFollowing(user.toEntity()).stream()
.filter(Objects::nonNull)
.map(followEntity -> new GetProfileResponseDto(followEntity.getFollower()))
.collect(Collectors.toList());
}