【问题标题】:Java listen on entity's child collection changeJava 监听实体的子集合变化
【发布时间】:2021-02-02 10:24:15
【问题描述】:

我正在尝试检测实体的关系是否已更新,但我尝试或发现的任何方法都不起作用。 我的简称是:

@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 更改,因为我想(在一个请求中)发送一组用户孩子的所有更改。

【问题讨论】:

    标签: java spring hibernate events collections


    【解决方案1】:

    对不起,我不得不问。监听器注册了吗?

    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 文件。

    之后,您应该会收到所有事件。

    请注意,还有其他事件,例如 POST_COLLECTION_REMOVE 和 POST_COLLECTION_RECREATE,您可能还需要监听它们以捕获插入/删除。

    【讨论】:

      猜你喜欢
      • 2020-05-18
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 2021-03-06
      • 2020-10-27
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多