강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

김예람님의 프로필 이미지
김예람

작성한 질문수

@Joincolumn에서 insertable = true를 해야하는경우

작성

·

605

0

현재

두엔터티 사이에서

User와 History가 1 : N의 관계를 가집니다.

다만 History값에서 user는 null인경우도있기때문에

조회시에는 left outer join을 사용하기 위해서 아래와 같이 하였습니다.

 

public class InoutHistory {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(insertable = false,updatable=false)
private String mac;
@ManyToOne (fetch = FetchType.LAZY)
@JoinColumn(name = "mac",referencedColumnName = "mac")
private User user;

 

@EntityGraph(attributePaths = {"user"})
Page<InoutHistory> findAll(Pageable pageable);

 

이 경우 제가 원하느대로

findAll을 호출시 left outer join문을 잘 만들어서 history에 따른 user들을 값을 가져옵니다. (user는 null인경우도 가능) -> @JoinColumn을 사용하는 이유

 

다만, 제가 inouthistoryEntity를 save할때 mac값이 insert되지 않아 값이 null로 들어가는 문제가 생깁니다. mac값을 insert할수 있고 left outer join으로 호출할수 있는 방안이 있을까요?

 

답변 1

0

안녕하세요, 인프런 AI 인턴이에요. @JoinColumn을 사용하는 이유는 관계형 데이터베이스에서 연관 테이블 간의 연결을 설정하기 위해 사용됩니다. @JoinColumn의 insertable = false 속성은 insert 시 해당 열에 값을 삽입하지 않도록 설정합니다. 따라서 mac 값이 insert되지 않는 문제가 발생하는 것은 정상적인 동작입니다.

left outer join으로 호출할 수 있는 방법은 이미 사용되고 있는 것 같습니다. 그리고 user 값이 null인 경우도 가능하다고 하셨으니, 이 부분에서 문제가 발생하지 않는다면 현재 구현이 올바른 것으로 보입니다.

만약 mac 값을 insert할 수 있어야 하고, left outer join으로 호출해야 한다면 다음과 같이 해볼 수 있습니다:

  1. @JoinColumn 속성 중 insertable을 true로 변경합니다. 이렇게 하면 mac 값이 insert될 수 있습니다.
  2. 그러나, 조회 시에 left outer join을 사용하기 위해서는 fetch 속성을 FetchType.EAGER로 변경해야 합니다. Fetch.EAGER로 설정하면 User 엔티티가 항상 조회됩니다. 그리고 User 엔티티가 null인 경우에도 이를 outer join으로 조회할 수 있습니다.

이 방법을 사용하면 mac 값을 insert할 수 있으면서, 조회 시에도 left outer join을 사용할 수 있을 것입니다. 하지만 EAGER 로딩은 성능에 영향을 미칠 수 있으므로, 신중하게 사용해야 합니다.

만약 이 방법이 동작하지 않거나 다른 문제가 발생한다면, 해당 이슈에 대해 더 자세히 알려주시면 더 도움을 드릴 수 있을 것입니다.

김예람님의 프로필 이미지
김예람

작성한 질문수

질문하기