java监听实体的子集合更改

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

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

@Entity
@EntityListeners(KidsListener.class)
@Table(name = "user")
public class User {
    @Setter(AccessLevel.PRIVATE)
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Access(AccessType.PROPERTY)
    private Long id;

    @Setter(AccessLevel.NONE)
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<Kid> kids = new HashSet<>(0);

    @Version
    @Column(name = "version")
    private Long version;
}

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

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

}

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

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

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

6tdlim6h1#

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

public class CustomIntegrator implements Integrator {

    public void integrate(
            Metadata metadata,
            SessionFactoryImplementor sessionFactory,
            SessionFactoryServiceRegistry serviceRegistry) {
        listenerRegistry.appendListeners(
            EventType.POST_COLLECTION_UPDATE,
            new KidsListener()
        );
    }

    @Override
    public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
    }
}

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

相关问题