2

this article을 참조하여 스프링 데이터 JPA에서 유형 JOINED의 데이터베이스 상속을 시도하고 있습니다. 이것은 잘 동작했다. 하지만 내 프로젝트에 MappedSuperClass 구현해야합니다. 나는 다음과 같은 방식으로 구현했습니다 :MapperSuperClass를 사용하여 Spring 데이터 JPA에서 데이터베이스 상속을 구현하는 방법은 무엇입니까?

Base.java

@MappedSuperclass 
public abstract class Base { 
    public abstract Long getId(); 
    public abstract void setId(Long id); 
    public abstract String getFirstName(); 
    public abstract void setFirstName(String firstName); 
} 

BaseImpl.java

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class BaseImpl extends Base { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String firstName; 

    ... 
} 

Super1.java

@MappedSuperclass 
public abstract class Super1 extends BaseImpl { 
    public abstract String getSuperName(); 
    public abstract void setSuperName(String guideName); 
} 

Super1Impl.java

@Entity 
public class Super1Impl extends Super1 { 
    private String superName; 

    ... 
} 

BaseBaseRepository.java

@NoRepositoryBean 
public interface BaseBaseRepository<T extends Base> extends JpaRepository<T, Long> { } 

BaseRepository.java

@NoRepositoryBean 
public interface BaseRepository<T extends Base> extends BaseBaseRepository<Base> { } 

BaseRepositoryImpl.java

@Transactional 
public interface BaseRepositoryImpl extends BaseRepository<BaseImpl> { } 

Super1Repository.java

@NoRepositoryBean 
public interface Super1Repository<T extends Super1> extends BaseBaseRepository<Super1> { } 

Super1RepositoryImpl.java

@Transactional 
public interface Super1RepositoryImpl extends Super1Repository<Super1Impl> { } 

내가 테스트 케이스의 Super1 개체를 저장하기 위해 노력하고있어 :

,536,913,632을

Caused by: org.springframework.beans.factory.BeanCreationException: 
    Error creating bean with name 'baseRepositoryImpl': 
    Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 
     This class [class com.example.entity.Base] does not define an IdClass 
..... 
Caused by: java.lang.IllegalArgumentException: This class [class com.example.entity.Base] does not define an IdClass 
....... 

Super1Impl에서 @PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id")을 시도하지만, 여전히 같은 오류가 발생 : 10

@Test 
public void contextLoads() { 
    Super1 super1 = new Super1Impl(); 
    super1.setSuperName("guide1"); 
    super1.setFirstName("Mamatha"); 
    super1.setEmail("jhhj"); 
    super1.setLastName("kkjkjhjk"); 
    super1.setPassword("jhjjh"); 
    super1.setPhoneNumber("76876876"); 

    System.out.println(super1Repository.save(super1)); 
} 

그러나 나는 다음과 같은 오류를 받고 있어요.

답변

2

오류는 잘못된 저장소 인터페이스 선언으로 인해 발생합니다.

BaseRepository<T extends Base> extends BaseBaseRepository<Base> 

Super1Repository<T extends Super1> extends BaseBaseRepository<Super1> 

이어야

BaseRepository<T extends Base> extends BaseBaseRepository<T> 

해야

Super1Repository<T extends Super1> extends BaseBaseRepository<T> 

으로 현재 선언 BaseBaseRepository<Base>Base 개체의 저장소를 의미하며 Base에는 @Id 필드가 없으므로 오류가 발생합니다.

+0

BaseRepository 및 Super1Repository를 제외한 모든 코드가 유지되었습니다. 객체를 저장 한 후에 객체를 받으면 Super1 유형으로 지정합니다. 저장소에 대한 언급이 없습니다. 도와주세요. – User1230321

+1

귀하의 의견을 이해할 수 없습니다. [Here] (https://github.com/manish-in-java/stackoverflow-questions/tree/master/41090908)는 수정 된 샘플 프로젝트입니다. 유닛 테스트를'mvn clean test'로 실행하면 잘 돌아가는 것을 볼 수 있습니다. 코드를 원래 코드로 변경하면 질문에서 언급 한 오류가 즉시 나타납니다. – manish

+0

위대한 작품. 나에게 많은 것을 의미한다. – User1230321