java监听实体的子集合更改

cfh9epnr  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(324)

我试图检测实体的关系是否已更新,但我尝试或发现的一切都不起作用。简言之,我拥有的是:

  1. @Entity
  2. @EntityListeners(KidsListener.class)
  3. @Table(name = "user")
  4. public class User {
  5. @Setter(AccessLevel.PRIVATE)
  6. @Id
  7. @GeneratedValue(strategy = GenerationType.IDENTITY)
  8. @Access(AccessType.PROPERTY)
  9. private Long id;
  10. @Setter(AccessLevel.NONE)
  11. @OneToMany(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
  12. private Set<Kid> kids = new HashSet<>(0);
  13. @Version
  14. @Column(name = "version")
  15. private Long version;
  16. }

我试过两种方法- EntityListeners 实施 PostCollectionUpdateEventListener ```
public class KidsListener implements PostCollectionUpdateEventListener {
@PostPersist
@PostUpdate
private void afterAnyUpdate(User user) {
// do something
}

  1. @Override
  2. public void onPostUpdateCollection(PostCollectionUpdateEvent event) {
  3. PersistentCollection collection = event.getCollection(); // do something
  4. }

}

  1. 这些都不管用,即使是家长版 `User` 实体未更改。
  2. 保存部分类似于:

User user = userRepository.findById(id);
for(Kid kid : mappedFromDto.getKids()){
user.getKids().add(kid);
}
userRepository.save(user);

  1. 我听不进去 `Kid` 更改是因为我想(在一个请求中)发送一个包含用户孩子的所有更改的包。
6tdlim6h

6tdlim6h1#

对不起,我得问问。你注册了听众吗?

  1. public class CustomIntegrator implements Integrator {
  2. public void integrate(
  3. Metadata metadata,
  4. SessionFactoryImplementor sessionFactory,
  5. SessionFactoryServiceRegistry serviceRegistry) {
  6. listenerRegistry.appendListeners(
  7. EventType.POST_COLLECTION_UPDATE,
  8. new KidsListener()
  9. );
  10. }
  11. @Override
  12. public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
  13. }
  14. }

你还必须创建一个 META-INF/services/org.hibernate.integrator.spi.Integrator 包含integrator类的完全限定名的文件。
在那之后,你应该收到所有事件。
请注意,还有其他事件,如post\u collection\u remove和post\u collection\u recreate,您可能还需要侦听这些事件才能捕获插入/删除。

展开查看全部

相关问题