拦截JPA查询以计算关键字段

拦截JPA查询以计算关键字段,jpa,spring-data,Jpa,Spring Data,我对JPA很陌生。我有一个特定的存储库,它使用的键包含调用方设置的部分和一些使用这些值自动计算的值。需要这样做:) 由于键和实体都是简单的Java类,所以在我看来,我需要将修改键(或将其替换为具有附加值的内部键)的代码放在存储库实现中。但是,我不认为将代码从SimpleParepository复制到我的自定义存储库是一个好主意……我认为实体管理器应该可以实现一些功能。基本上,我需要的是代理,它在每次调用find()或delete()之类的东西时都会被调用,获取实体,更新其键,将调用传递给真正的存

我对JPA很陌生。我有一个特定的存储库,它使用的键包含调用方设置的部分和一些使用这些值自动计算的值。需要这样做:)

由于键和实体都是简单的Java类,所以在我看来,我需要将修改键(或将其替换为具有附加值的内部键)的代码放在存储库实现中。但是,我不认为将代码从SimpleParepository复制到我的自定义存储库是一个好主意……我认为实体管理器应该可以实现一些功能。基本上,我需要的是代理,它在每次调用find()或delete()之类的东西时都会被调用,获取实体,更新其键,将调用传递给真正的存储库实现

有没有人能给我指出正确的方向,或者举个类似的例子


谢谢

在JPA中,你有很多这样的活动,只要选择一个最适合你的。看起来您正在查找
@PrePersist


也就是说,如果这些字段的数据仅基于其他字段的数据进行计算,则不利于数据库规范化。更明智的方法是使计算字段成为瞬态的,只提供getter,它将基于持久字段计算值。

好吧,我们不关心规范化,因为我们处理的是支持反规范化的数据库;)-不,这不起作用,因为没有像“预加载”那样的回调。而且我似乎也不希望修改这些回调中的实体(或它们的键)。
PreLoad
毫无意义,因为在加载之前,对象在内存中根本不存在
PostLoad
对于设置计算属性很有用,但我同意如果您想持久化这些属性(在这种情况下,请使用
PrePersist
PreUpdate
),它不是非常具体的位置:我有一个主键(一个字符串),用于生成主键的另外两个组件。这些组件与原始字符串一起用于为Cassandra创建复合主键,其中一些值用于行键,其余值用于集群键。基本上,我有一个真正的主键(从高级数据模型的角度)和用于优化的特定于存储的键。我需要计算这些。但是它们的算法是不同的,我无法将它们链接到密钥POJO。