共享所有 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 列表中。
这是我通常提倡将 domain 和 persistence 对象分开的地方。
从持久性的角度来看,你的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;
}
我目前正在使用带有 Hibernate 实现的 JPA 实体,我想知道是否有办法在同一 class 的所有实体之间共享某个查询结果?
我想要的是在实体中实现一个简单的 Transient 方法,该方法检查当前实体的某些 属性 是否在存储在数据库中另一个 table 中的值列表中,但我不希望每个执行此额外查询的实体都获得值列表。
有没有办法存储这个缓存的查询结果并在特定实体内访问它?
例如:
个人实体:
private Long id;
private String name;
...
@Transient
public boolean isIdBanned(){
(check against the cached list)
}
在这里,我想使用缓存的查询结果检查此人的 ID 是否在禁止的 ID 列表中。
这是我通常提倡将 domain 和 persistence 对象分开的地方。
从持久性的角度来看,你的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;
}