작성
·
249
·
수정됨
0
안녕하세요.
이번에 드릴 질문이 강의 내용에서 약간 벗어나는 내용일 수도 있을것 같습니다. 그래서 꼭 해주실 필요는 없지만 만약에 답변이 가능하다면 해주신다면 감사하겠습니다.
개인프로젝트 중에 생긴 문제입니다.
목차
1. 문제상황
2. 지금 하고 있는거
3. 질문
문제 상황
클래스
@MappedSuperClass class Human {
@Id
private string field1;
private Long field2;
private Type type;
}
@Entity class Student extends Human{}
@Entity class Teacher extends Human{}
...
레포지토리
@Repository
public interface StudentRepository() implements JpaRepository<Student, String>{
Page<Student> findByField2LessThanEqual(Long field2, Pageable pageable);
}
@Repository
public interface TeacherRepository() implements JpaRepository<Teacher, String>{
Page<Student> findByField2LessThanEqual(Long field2, Pageable pageable);
}
이런 관계에서 Human 을 상속받는 클래스가 100개로 늘었다고 가정하겠습니다.
jpa 쿼리 크리에이션을 모든 레포지토리에 적용해야 하는 상황입니다.
지금 제가 하고 있는것
제가 지금 하고 있는 방법이 있긴하지만 더 좋은 방법 있을것 같습니다. 추천해주신다면 감사하겠습니다.
public interface PagebleRead{
Page<Human> findByField2LessThanEqual(Long field2, Pageable pageable);
}
@Repository
public interface StudentRepository() implements JpaRepository<Student, String>, PageableRead{
}
@Repository
public interface TeacherRepository() implements JpaRepository<Teacher, String>, PageableRead{
}
이렇게 하면 선언하는데에는 손이 덜 가지만 PageableRead 의 타입으로 JpaRepository 의 함수를 호출 할 수 없습니다.
PageableRead repo = findRepository();
repo.save(Student.builder().build());
이런게 안됩니다. PageableRead 대신에
public interface CommonJpaMethod{
Page<Human> findByField2LessThanEqual(Long field2, Pageable pageable);
Human save(Human human);
// jpa 함수 중 사용할 함수 시그니쳐 선언 ...
}
이렇게 공통인터페이스를 선언하면 기능하긴 하지만 정석적인 방법인지는 모르겠습니다.
3. 결론
모든 서브 클래스에 손을 대지 않으면서 하나의 repository 클래스로 query creation 함수와 jpa 에서 제공하는 기본 함수를 쓸 수 있는 방법이 있을까요?
답변 1
1
안녕하세요. dankim님
JPA 기본편에서 설명하는 상속관계와 @MappedSuperClass의 차이에 대해서 먼저 이해가 필요합니다. 이 부분을 복습해보시면 방향이 잡힐꺼에요.
감사합니다.
지금 찾아가지고 해결하고 있습니다. : ) 강의 잘보고 있습니다 . 감사합니다