共享所有 Hibernate 实体的通用查询结果

Share common query result for all Hibernate Entities

我目前正在使用带有 Hibernate 实现的 JPA 实体,我想知道是否有办法在同一 class 的所有实体之间共享某个查询结果?

我想要的是在实体中实现一个简单的 Transient 方法,该方法检查当前实体的某些 属性 是否在存储在数据库中另一个 table 中的值列表中,但我不希望每个执行此额外查询的实体都获得值列表。

有没有办法存储这个缓存的查询结果并在特定实体内访问它?

例如:

个人实体:

private Long id;
private String name;

...

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

在这里,我想使用缓存的查询结果检查此人的 ID 是否在禁止的 ID 列表中。

这是我通常提倡将 domainpersistence 对象分开的地方。

从持久性的角度来看,你的Person实体并不关心这个封禁名单。从持久性的角度来看,它绝对没有具体用途,因此我认为它不属于 Person 实体中的任何地方。

从您的域的角度来看,您基本上是在尝试满足为您的域提供一种方式来询问 Person"Hey are you banned?" 的要求

@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 实例一起传递给内部使用该列表的域包装器 class、Person

这里的好处是 PersonBanService 可以选择缓存返回的结果,允许在集群或多个请求调用之间共享该列表,而无需使用您可用的任何缓存框架访问数据库.

现在在您的 Person 域对象中

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

public boolean isBanned() {
  return banned;
}