• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

강의 질문있습니다.

24.03.08 08:58 작성 24.03.12 04:35 수정 조회수 171

0

에러사항2.pngjpa에러사항2.png에러사항.png앨범 클래스 파일에는 아래와 같은 에러가 나옵니다.(3번째 사진)

Persistent entity 'Album' should have primary key

코드입니다.

package jpabook.jpashop.domains.Item;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

//import javax.persistence.*;


@Entity
@DiscriminatorValue("A")
@Getter
@Setter
public class Album {

    private String artist;
    private String etc;
}

OrderItem 클래스 파일에는 아래와 같은 에러가 나옵니다.(2번째 사진)

'Many To One' attribute type should not be 'Item'

코드입니다.

package jpabook.jpashop.domains;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.Entity;

import jpabook.jpashop.domains.Item.Item;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import jakarta.persistence.*;



@Entity
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class OrderItem {

    @Id @GeneratedValue
    @Column(name = "order_item_id")
    private Long id;

//    @ManyToOne(fetch = LAZY)
    @ManyToOne
    @JoinColumn(name = "item_id")
    private Item item;

    @JsonIgnore
//    @ManyToOne(fetch = LAZY)
    @ManyToOne
    @JoinColumn(name = "order_id")
    private Order order;

//    private int orderPrice; //주문 가격
//    private int count; //주문 수량

}

카테고리 클래스 파일에는 아래와 같은 에러가 나옵니다.(1번째 사진)

'Many To Many' attribute value type should not be 'Item'

코드입니다.

package jpabook.jpashop.domains;

import jakarta.persistence.*;

import jpabook.jpashop.domains.Item.Item;
import lombok.Getter;
import lombok.Setter;

//import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter @Setter
public class Category {

    @Id @GeneratedValue
    @Column(name = "category_id")
    private Long id;

    private String name;

    @ManyToMany
    @JoinTable(name = "category_item",
            joinColumns = @JoinColumn(name = "category_id"),
            inverseJoinColumns = @JoinColumn(name = "item_id"))
    private List<Item> items = new ArrayList<>();

//    @ManyToOne(fetch = LAZY)
    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Category parent;

    @OneToMany(mappedBy = "parent")
    private List<Category> child = new ArrayList<>();

//    //==연관관계 메서드==//
//    public void addChildCategory(Category child) {
//        this.child.add(child);
//        child.setParent(this);
//    }

}

 

강의를 여러번 들어도 틀린부분은 없는데 에러가 나오는게 이해가 되지 않아 코드 올립니다.

 

답변 2

·

답변을 작성해보세요.

0

안녕하세요. zzzzz님

 

Album의 경우 옆에 extends Item이 들어가야 합니다. 참고로 Book, Movie도 마찬가지 입니다.

@Entity
@DiscriminatorValue("A")
@Getter
@Setter
public class Album extends Item {

    private String artist;
    private String etc;
}

 

Item의 경우 다음 코드가 추가되어야 합니다.

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
@Getter @Setter
public abstract class Item {

Delivery에는 다음 코드가 추가되어야 합니다.

@Entity
@Getter @Setter
public class Delivery {

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.03.10

안녕하세요, 인프런 AI 인턴입니다.

zzzzz님, JPA 엔티티에서 발생하는 에러들에 대해 질문하신 내용 잘 확인했습니다. 각 엔티티에서 발생하는 에러들을 하나씩 살펴보겠습니다.

  1. Album 클래스 파일 관련 에러 (3번째 사진):
    “Persistent entity ‘Album’ should have primary key”
    이 에러는 Album 엔티티에 기본 키(primary key)가 정의되지 않았다는 의미입니다. JPA 스펙상 모든 @Entity가 되는 클래스는 @Id 어노테이션을 사용해서 기본 키를 명시해야 합니다. 예를 들어 Long 타입의 id 필드를 추가하여 @Id 어노테이션을 붙여주면 됩니다.
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
  1. OrderItem 클래스 파일 관련 에러 (2번째 사진):
    ”‘Many To One’ attribute type should not be ‘Item’”
    이 에러 메시지는 @ManyToOne 관계에서 문제가 있음을 알려주는 것인데요, 보통 이러한 메시지는 IDE가 특정 문제를 감지했을 때 나타납니다. 실제로 Item 엔티티와의 연관 관계 매핑에 문제가 있다면 코드를 확인해야 합니다. 다만, 코드 상에는 명백한 오류가 보이지 않습니다. 해당 에러가 발생하는 정확한 이유를 알려면 Item 클래스의 정의를 확인해봐야 할 것 같습니다.

  2. Category 클래스 파일 관련 에러 (1번째 사진):
    ”‘Many To Many’ attribute value type should not be ‘Item’”
    이 에러 메시지 또한 IDE가 @ManyToMany 관계에서 예상하지 못한 타입을 감지했을 때 나타나는데, 크로스 테이블을 정의한 joinTable 설정에서 문제가 없어 보입니다. 여기서도 Item 클래스의 정의를 확인해볼 필요가 있습니다. 일반적으로는 @ManyToMany 어노테이션을 사용하는 필드로 다른 엔티티를 참조하는 경우 그 타입은 다른 엔티티 클래스 타입이어야 하는데, 이 부분에서 문제가 없으면 추가적인 문제를 감지하기 위해 전체 프로젝트 빌드를 시도해보는 것이 좋습니다.

전체 코드에 대한 링크도 감사드립니다. 하지만 위에서 언급한 내용들로 문제를 해결하지 못하시면, 강의 Q&A 섹션을 통해 구체적인 오류 메시지와 함께 추가 질문을 올려 주시면 강사님이 더 정확한 답변을 드릴 것입니다.

긴 답변 읽어주셔서 감사합니다. 추가적인 도움이 필요하시면 언제든지 인프런 강의의 Q&A에 질문을 남겨주세요.