holyeye/devon2012

BaseEntity 클래스를 상속받을 경우 컴파일 오류 발생.

Opened this issue · 3 comments

http://stackoverflow.com/questions/12135233/entity-not-recognizing-the-id-in-a-mappedsuperclass

와 관련된 내용입니다.

영한님의 BaseEntity 클래스를 상속받으면

상속받은 클래스에 다음과 같은 오류가 발생하면서 컴파일이 안되더군요.

the entity has no primary key attribute defined

상속받은 클래스에서 위와 같은 메시지가 출력됩니다.

그래서 BaseEntity를 다음과 같이 수정하였습니다. 위의 stackoverflow.com 의 내용을 참고로 하였습니다.

package kr.co.sunnyvale.guestbook.domain;

import java.io.Serializable;

import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Version;

import org.springframework.data.jpa.domain.AbstractPersistable;

@MappedSuperclass
@access(AccessType.PROPERTY)
public abstract class BaseEntity extends AbstractPersistable{

private static final long serialVersionUID = -8669707500586538457L;

@Version
@Access(AccessType.FIELD)
private long version;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public PK getId() {
    return super.getId();
}

@Override
public void setId(PK id) {
    super.setId(id);
}

}

혹시 더 좋은 방법이 있을까요? eclipse 의 jpa관련된 버그라는 말도 있는 듯 한데. eclipse는 최신버전인데 말입니다. ^^;;;

@urstory 안녕하세요.

콘솔에서 mvn clean package 하거나 제가 사용하는 Intellij 13에서는 문제가 없네요.

참고로 BaseEntity는 스프링 데이터 JPA가 제공하는 AbstractPersistable 클래스를 상속 받습니다. 여기에서 @Id를 필드 엑세스로 접근하거든요. 이렇게 아이디를 필드 엑세스로 접근하면 나머지 필드들도 필드 엑세스 전략을 사용합니다. (물론 @Access를 사용해서 직접 설정하면 이야기가 달라집니다.)

혹시 상속받는 클래스에서 프로퍼티 엑세스 전략을 사용하시는지요? 두 전략이 섞이면서 이클립스 IDE에서 문제가 발생하는 건 아닌지 의심됩니다.

상속 받은 클래스를 첨부해주시겠어요?

아 영한님의 BaseEntity를 그대로 해도 문제가 발생하는 것을 보면 eclipse 의 jpa관련된 부분이 바보짓하는 것으로 보입니다. -_-;;;

감사합니다.

@urstory 이 코드를 작성하는 시점에는 저도 이클립스를 사용했습니다. 이클립스 최신버전에서 발생하는 문제인가 봐요 ㅠㅠ...

저도 코드 돌릴때 이클립스 꼭 확인해봐야 겠어요. 감사합니다. :)