[SPRING] Spring Data JPA에서 엔터티 상속을 처리하는 가장 좋은 방법
SPRINGSpring Data JPA에서 엔터티 상속을 처리하는 가장 좋은 방법
다음과 같은 계층 구조를 가진 세 개의 JPA 엔티티 클래스 A, B 및 C가 있습니다.
A
|
+---+---+
| |
C B
그건:
@Entity
@Inheritance
public abstract class A { /* ... */ }
@Entity
public class B extends A { /* ... */ }
@Entity
public class C extends A { /* ... */ }
Spring Data JPA를 사용하면 그러한 엔티티에 대한 저장소 클래스를 작성하는 가장 좋은 방법은 무엇입니까?
나는 내가 다음과 같이 쓸 수 있음을 안다.
public interface ARespository extends CrudRepository<A, Long> { }
public interface BRespository extends CrudRepository<B, Long> { }
public interface CRespository extends CrudRepository<C, Long> { }
하지만 클래스 A에 필드 이름이 있다면 ARepository에이 메서드를 추가합니다.
public A findByName(String name);
나는 다른 두 저장소에 같은 메소드를 작성해야하는데, 약간 짜증이납니다. 이러한 상황을 처리하는 더 좋은 방법이 있습니까?
다른 두 저장소는 모든 CRUD 작업을 노출해야하는 반면 ARespository는 읽기 전용 저장소 (즉, Repository 클래스 확장) 여야한다는 점도 다른 점이 있습니다.
가능한 해결책을 알려주십시오.
해결법
-
==============================
1.Netgloo의 블로그에서이 게시물에 설명 된 솔루션을 사용했습니다.
Netgloo의 블로그에서이 게시물에 설명 된 솔루션을 사용했습니다.
아이디어는 다음과 같은 일반적인 저장소 클래스를 만드는 것입니다.
@NoRepositoryBean public interface ABaseRepository<T extends A> extends CrudRepository<T, Long> { // All methods in this repository will be available in the ARepository, // in the BRepository and in the CRepository. // ... }
다음과 같이 세 가지 리포지토리를이 방법으로 작성할 수 있습니다.
@Transactional public interface ARepository extends ABaseRepository<A> { /* ... */ } @Transactional public interface BRepository extends ABaseRepository<B> { /* ... */ } @Transactional public interface CRepository extends ABaseRepository<C> { /* ... */ }
또한 ARepository에 대한 읽기 전용 저장소를 얻으려면 ABaseRepository를 읽기 전용으로 정의 할 수 있습니다.
@NoRepositoryBean public interface ABaseRepository<T> extends Repository<T, Long> { T findOne(Long id); Iterable<T> findAll(); Iterable<T> findAll(Sort sort); Page<T> findAll(Pageable pageable); }
그리고 BRepository는 Spring Data JPA의 CrudRepository를 확장하여 읽기 / 쓰기 저장소를 구현합니다.
@Transactional public interface BRepository extends ABaseRepository<B>, CrudRepository<B, Long> { /* ... */ }
from https://stackoverflow.com/questions/27543771/best-way-of-handling-entities-inheritance-in-spring-data-jpa by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] javax.transaction.Transactional 대 org.springframework.transaction.annotation.Transactional (0) | 2018.12.22 |
---|---|
[SPRING] Spring MVC 컨트롤러에서 Spring 데이터 투영을 적용하는 방법은 무엇입니까? (0) | 2018.12.22 |
[SPRING] 로그에 Spring 트랜잭션 표시하기 (0) | 2018.12.22 |
[SPRING] Tomcat에 Spring 부트 배치 (0) | 2018.12.22 |
[SPRING] jdbctemplate를 통해 SQL 삽입의 ID (0) | 2018.12.22 |