복붙노트

[SPRING] Spring Data JPA에서 엔터티 상속을 처리하는 가장 좋은 방법

SPRING

Spring 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. ==============================

    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> 
    { /* ... */ }
    
  2. from https://stackoverflow.com/questions/27543771/best-way-of-handling-entities-inheritance-in-spring-data-jpa by cc-by-sa and MIT license