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

斜线3584

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

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

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

例如:

个人实体:

private Long id;
private String name;

...

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

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

优点

这就是我通常提倡将持久对象分离的地方

从持久性的角度来看,你的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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Hibernate / JPA将本机查询的结果映射到非实体持有实体

如何使用Hibernate Query Language查询所有具有关联实体的实体?

具有共享主键的 Hibernate 拥有实体端

如何使用 Hibernate 在 Spring Boot 中查询实体的所有关系对象?

在Hibernate中的实体之间共享实体

通过使用被查询实体的子实体的信息对Hibernate Criteria查询的结果进行排序

Hibernate Orphan在共享实体上删除

Hibernate:如何从具有多个类的查询中获取结果

JPA / HIBERNATE:如何查询返回非实体对象或带有内部非实体对象的对象列表?

Hibernate查询与地图属性实体

Hibernate Search查询多个实体

使用@GeneratedValue在我的所有域中共享SpringBoot-Hibernate-Mysql ID主键值序列

如何使HIbernate提取根实体的所有属性以及仅关联实体的特定属性?

如何使用Hibernate将SQL查询的结果最好地映射到非实体Java对象?

如何限制Hibernate仅从Criteria API中涉及多个实体的根实体生成带有列的SQL查询

如何使用Hibernate更新所有实体属性的仅一部分

Hibernate Envers:如何获取所有当前实体及其创建时间戳记

Hibernate HQL:当且仅当所有子实体都具有相同值的属性时,如何选择父实体?

SQL的Hibernate是不是重新调整相同的结果有直接的SQL查询

带有枚举字段的Hibernate Search / Lucene范围查询不返回任何结果

通过许多实体进行Hibernate Complex查询

Hibernate实体查询到Set <>

Hibernate HQL:找不到要查询的实体

Hibernate - SQL 查询:如何获取从特定节点开始的所有子 descandants

即使在启用所有属性后,Hibernate 也不会记录触发的 SQL 查询

使用Hibernate Search查询并获得所有项目而无需分页

Hibernate(JPA)如何执行热切查询,加载所有子对象

使用Hibernate通过公共桥表映射3个实体

带有“间隔”的JPA Hibernate查询的问题