기본 콘텐츠로 건너뛰기

JPA @OneToMany/@ManyToOne에서 mappedBy reference an unknown target entity 에러 해결하기

JPA mappedBy reference an unknown target entity 오류 원인과 해결 방법

JPA로 @OneToMany / @ManyToOne 양방향 매핑을 구현하다 보면 다음과 같은 오류를 한 번쯤은 만나게 됩니다.


mappedBy reference an unknown target entity property
  

특히 아래와 같이 mappedBy="parentVO"와 같이 지정한 경우, 필드명 / 매핑 관계 / 엔티티 설정에 조금만 틀어져도 이 오류가 바로 발생합니다.

1. 예제 코드 구조 (Parent & Child)

질문에서 사용한 구조를 먼저 정리해보면 다음과 같습니다.

A Class (Parent)


@Entity
public class Parent {

    @Id
    @GeneratedValue
    private Long parentSeq;

    @OneToMany(mappedBy = "parentVO")
    private List<Child> rsrcGuildsList;

    // getter / setter ...
}
  

B Class (Child)


@Entity
public class Child {

    @Id
    @GeneratedValue
    private Long childSeq;

    @ManyToOne(optional = false)
    @JoinColumn(name = "parent_seq", updatable = false, insertable = false)
    private Parent parentVO;

    // getter / setter ...
}
  

Parent에서는 @OneToMany(mappedBy="parentVO")를 통해 Child 쪽의 parentVO 필드를 바라보도록 설정했고, Child에서는 @ManyToOne + @JoinColumn(name = "parent_seq")로 부모 키를 참조하도록 되어 있습니다.

그런데 이때 JPA가 다음과 같은 메시지를 뿜을 수 있습니다.


mappedBy reference an unknown target entity property: Child.parentVO
  

즉, mappedBy로 적어준 "parentVO"를 Child 엔티티에서 제대로 찾지 못했다는 의미입니다.

2. mappedBy reference an unknown target entity 오류 의미

@OneToMany(mappedBy="...") 에서 mappedBy반대편 엔티티에서 이 관계를 관리하는 “필드명”을 의미합니다.

  • Parent 입장: @OneToMany(mappedBy="parentVO") → Child 안의 parentVO 필드를 바라봄
  • Child 입장: @ManyToOne으로 실제 외래키(parent_seq)를 관리

그런데 JPA가 스캔을 해보니:

  • Child 클래스가 엔티티(@Entity)로 인식되지 않았거나
  • Child 클래스 안에 parentVO라는 필드가 없거나
  • 필드는 있지만, 연관관계 필드로 제대로 인식되지 않는 경우

이런 상황에서 "mappedBy reference an unknown target entity" 오류가 발생합니다.

3. 가장 흔한 원인 정리

3-1. Child 엔티티에 @Entity 누락

Child 클래스에 @Entity가 빠져 있으면, JPA 입장에서는 Child 자체를 엔티티로 인식하지 못합니다.


@Entity  // ✅ 이게 빠져 있으면 mappedBy에서 인식을 못함
public class Child {
    ...
}
  

3-2. mappedBy 값과 필드명 불일치

Parent에서 mappedBy = "parentVO"라고 적었다면, Child 엔티티 안에는 꼭 “parentVO”라는 이름의 필드가 존재해야 합니다.

  • 필드명이 parent, parentEntity 등으로 다른데 mappedBy="parentVO"로 적은 경우
  • 대소문자 차이 (parentVo vs parentVO)

이런 경우에도 동일 오류가 발생합니다.

3-3. JoinColumn / insertable / updatable 설정 문제

Child 쪽에서 @JoinColumn(name="parent_seq", updatable=false, insertable=false)로 둘 다 false를 걸어둬서 JPA가 이 필드를 연관관계 주인으로 인식하지 못하는 경우도 있습니다.

일반적인 양방향 매핑에서는 다음과 같이 Child 쪽이 연관관계 주인이 되도록 설정합니다.


@ManyToOne(optional = false)
@JoinColumn(name = "parent_seq") // ⭐ insertable / updatable 기본값 true
private Parent parentVO;
  

그리고 Parent는 단순히 읽기용(역방향) 컬렉션으로만 사용하고 mappedBy를 통해 연관관계 주인(Child)을 가리키게 합니다.

4. 추천 매핑 예제 (정리된 버전)

Parent 엔티티 예시


@Entity
public class Parent {

    @Id
    @GeneratedValue
    private Long parentSeq;

    @OneToMany(mappedBy = "parentVO")
    private List<Child> rsrcGuildsList = new ArrayList<>();

    // 양방향 편의 메서드 (선택)
    public void addChild(Child child) {
        rsrcGuildsList.add(child);
        child.setParentVO(this);
    }

    // getter / setter ...
}
  

Child 엔티티 예시


@Entity
public class Child {

    @Id
    @GeneratedValue
    private Long childSeq;

    @ManyToOne(optional = false)
    @JoinColumn(name = "parent_seq")  // 외래키 컬럼
    private Parent parentVO;

    // getter / setter ...
}
  

위처럼 구성하면 mappedBy="parentVO"는 Child 엔티티의 parentVO 필드를 정확히 바라보게 되고, mappedBy reference an unknown target entity 오류 없이 정상 매핑됩니다.

5. 디버깅 체크리스트

이 오류가 발생했을 때 아래 항목을 하나씩 체크해보세요.

  • ✅ Child 클래스에 @Entity가 선언되어 있는가?
  • mappedBy에 적은 이름과 Child의 필드명이 정확히 일치하는가? (대소문자 포함)
  • ✅ Child 쪽 연관관계 필드에 @ManyToOne 또는 @OneToOne이 붙어 있는가?
  • @JoinColumn 설정이 너무 과도하게 insertable=false, updatable=false로 막혀 있지는 않은가?
  • ✅ Parent/Child 둘 다 같은 패키지 또는 같은 persistence-unit에 포함되어 있는가?

6. 정리

mappedBy reference an unknown target entity 오류는 대부분 필드명 불일치, 엔티티 인식 실패, 연관관계 주인 설정 문제에서 시작됩니다.

  • mappedBy는 “반대편 엔티티의 연관관계 필드명”이라는 점을 꼭 기억하기
  • Child 쪽이 외래키를 직접 가지는 연관관계 주인이 되도록 설계하기
  • @Entity, @JoinColumn, insertable/updatable 설정을 다시 한 번 점검하기

위 예제와 체크리스트를 기준으로 코드를 정리하면 JPA 양방향 매핑에서 발생하는 mappedBy 관련 오류를 훨씬 수월하게 해결할 수 있습니다.

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...