2017-03-07 5 views
0

現在、Hibernate実装でJPAエンティティを使用していますが、同じクラスのすべてのエンティティ間で特定のクエリ結果を共有する方法があるのだろうか?すべてのHibernateエンティティの共通クエリ結果を共有する

私が望むのは、現在のエンティティの特定のプロパティがDB内の別のテーブルに格納されている値のリストにあるかどうかをチェックするエンティティに単純なTransientメソッドを実装することですが、この追加クエリは値のリストを取得します。

このキャッシュされたクエリ結果を格納し、特定のエンティティ内でアクセスする方法はありますか?例えば

Personエンティティ:ここ

private Long id; 
private String name; 

... 

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

私は人のidは、キャッシュされたクエリの結果を使用して禁止IDSリスト内にあるかどうかを確認したいと思います。

+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

関連する問題