我目前正在使用带有 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] 删除。
我来说两句