如何解决如何在 spring 数据存储库中挂钩所有成功的插入、更新和删除
我目前正在尝试构建获取存储库所有成功提交的实体更改列表的钩子:
@Entity data class User(@Id val id: Long,val name: String)
interface extends JpaRepository<User,Long>
@Service
class UserService(val userRepository:UserRepository){
@Transactional
fun someProcess(){
val newUser = User()
newUser.name = "newUser"
userRepository.save(newUser)
val userToUpdate = userRepository.findById(1).get()
userToUpdate.name = "updatedUser"
val userToDelete = userRepository.findById(2).get()
userRepository.delete(userToDelete)
}
// TODO implement hooks
fun hookAllInserts(inserts :List<User>){
// list is expected to contain newUser
}
fun hookAllUpdates(updates: List<User>) {
// list is expected to contain the latest state of updatedUser
}
fun hookAllDeletions(deletions: List<User>){
// list is expected to contain the deletedUser
}
}
钩子应该只在成功提交后触发,所以回滚的更改不会传播。
如何使用 spring 数据实现这一点?
解决方法
我还没有找到适用于所有 spring 数据存储库的通用解决方案, 但是,当人们将 spring 数据与 hibernate 结合使用时,有一种解决方案:
@Component
class ChangeListener(
private val entityManagerFactory: EntityManagerFactory,) : PostUpdateEventListener,PostInsertEventListener,PostDeleteEventListener {
@PostConstruct
private fun init() {
val sessionFactory = entityManagerFactory.unwrap(SessionFactoryImpl::class.java)
val registry = sessionFactory.serviceRegistry.getService(EventListenerRegistry::class.java)
registry.getEventListenerGroup(EventType.POST_COMMIT_UPDATE).appendListener(this)
registry.getEventListenerGroup(EventType.POST_COMMIT_INSERT).appendListener(this)
registry.getEventListenerGroup(EventType.POST_COMMIT_DELETE).appendListener(this)
}
override fun requiresPostCommitHanding(persister: EntityPersister): Boolean {
return true
}
override fun onPostUpdate(event: PostUpdateEvent) {
// event.entity contains the latest state of the entity
}
override fun onPostDelete(event: PostDeleteEvent) {
// event.entity contains the latest state of the entity
}
override fun onPostInsert(event: PostInsertEvent) {
// event.entity contains the last state of the entity
}
}
它基于 Hibernate EventListeners
另见here。
Vlad Mihalcea 的博客上还有一个不错的 post
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。