2017-03-07 2 views
0

현재 동일한 클래스의 모든 엔티티간에 특정 질의 결과를 공유하는 방법이 있는지 궁금해하고 있었는데, Hibernate 구현에서 JPA 엔티티를 사용하고 있습니까?모든 Hibernate 엔티티에 대한 공통 쿼리 결과 공유

내가 원하는 것은 현재 엔터티의 특정 속성이 DB의 다른 테이블에 저장된 값 목록에 있는지 확인하는 엔터티에 간단한 Transient 메서드를 구현하는 것이지만 각 엔터티를 실행하지 않으려 고합니다. 이 추가 쿼리는 값 목록을 가져옵니다.

이 캐시 된 쿼리 결과를 저장하고 특정 엔터티에 액세스 할 수있는 방법이 있습니까? 예를 들어

:

사람 엔티티 : 여기

private Long id; 
private String name; 

... 

@Transient 
public boolean isIdBanned(){ 
(check against the cached list) 
} 

나는 사람의 ID가 캐시 된 쿼리 결과를 사용하여 금지 된 식별자 목록 안에 있는지 확인하려는 것입니다.

+0

내부 지금

이 캐시 목록은 응용 프로그램이 응용 프로그램에 정적 레지스트리에 글로벌 보유하거나 뭔가 뭔가 있다고 가정하는 것이 안전이다 한 번 아마도 웹 인터셉터로드 해당 요청에 대해 캐시 된 목록을 다시 사용하십니까? – Naros

+0

@Naros 지금 목록은 구성 데이터베이스 테이블에 저장됩니다. – slash3584

답변

1

이것은 일반적으로 도메인지속성 개체를 분리하는 것을지지하는 곳입니다.

지속성의 관점에서 귀하의 Person 엔티티는이 차단 목록에 신경 쓰지 않습니다. 그것은 영속성 관점에서 절대적으로 구체적인 목적을 제공하지 않으며 따라서 나는 Person 엔티티에 속하지 않는다고 주장 할 것입니다.

도메인의 관점에서 볼 때 기본적으로 도메인에 대해 Person, 에게 물어볼 수있는 방법을 제공해야한다는 요구 사항을 충족 시키려고합니다. "안녕하세요?" 기본적

@Service 
public class PersonBanService { 
    @Cacheable 
    @Transactional(readOnly = true) 
    public List<Integer> getBanList() { 
    return personBanRepository.findAll(); 
    } 
} 

@Service 
public class PersonDomainService { 
    @Transactional(readOnly = true) 
    public List<Person> getPersons() { 
    List<Integer> banList = personBanService.getBanList(); 
    List<PersonEntity> people = personRepository.findAll(); 
    return people.stream() 
     .map(p -> new Person(p, banList.contains(p.getId()))) 
     .collect(Collectors.toList()); 
    } 
} 

이러한 두 문제의 매개체로서 작용 PersonDomainService. 도메인 메서드 호출 당 한 번 금지 목록을 가져온 다음 PersonEntity 인스턴스와 함께 도메인 래퍼 클래스 인 내부적으로 해당 목록을 사용하는 Person으로 전달합니다.

여기서 좋은 점은 PersonBanService이 반환 된 결과를 캐시하도록 선택할 수 있으므로 사용 가능한 모든 캐시 프레임 워크를 사용하여 데이터베이스를 치지 않고도 클러스터 또는 여러 요청 호출에서 해당 목록을 공유 할 수 있습니다. 당신의 Person 도메인 객체

public Person(PersonEntity entity, boolean banned) { 
    this.person = entity; 
    this.banned = banned; 
} 

public boolean isBanned() { 
    return banned; 
} 
+0

감사합니다! 나는 전에이 접근법에 대해 생각하지 않았다! – slash3584