博主首页

hibernate事件监听器,可用于修改前后日志记录,新增修改属性值默认值设置,

复制代码
 
复制代码
@Component
public class GlobalEntityHandler implements PostLoadEventListener {

    /**
     * 注册监听器
     * @param entityEntryFactory
     */
    public GlobalEntityHandler(EntityManagerFactory entityEntryFactory){
        SessionFactoryImplementor sessionFactoryImplementor = entityEntryFactory.unwrap(SessionFactoryImplementor.class);
        sessionFactoryImplementor.getServiceRegistry()
                .getService(EventListenerRegistry.class)
                .prependListeners(EventType.POST_LOAD,this);
    }

    @Override
    public void onPostLoad(PostLoadEvent event) {

        Slog.info(event.getEntity().getClass().getName()+"--数据库返回:"+ JSON.toJSONString(event.getEntity()));
    }
}
复制代码

 












package ca.acentury.lamta.lm.advice; import ca.acentury.lamta.framework.abstraction.session.LamtaCurrentUserInfoA; import ca.acentury.lamta.framework.abstraction.session.LamtaHttpSession; import ca.acentury.lamta.framework.data.LamtaIdentity; import ca.acentury.lamta.spring.framework.session.LamtaSpringSessionFactory; import ca.acentury.lamta.spring.jpa.support.entity.AbstractStandardPO; import org.hibernate.HibernateException; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.
event.service.spi.EventListenerRegistry; import org.hibernate.event.spi.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.persistence.EntityManagerFactory; import java.util.Map; @Component public class GlobalEntityHandler implements PersistEventListener, MergeEventListener {     @Autowired LamtaSpringSessionFactory sessionFactory; public GlobalEntityHandler(EntityManagerFactory entityManagerFactory) { SessionFactoryImplementor sessionFactory = entityManagerFactory.unwrap(SessionFactoryImplementor.class); EventListenerRegistry registry = sessionFactory .getServiceRegistry() .getService(EventListenerRegistry.class); registry.prependListeners(EventType.PERSIST, this); registry.prependListeners(EventType.MERGE, this); } @Override public void onPersist(PersistEvent event) throws HibernateException {
    //新增事件监听,当实体类id为null时会执行 Object entity
= event.getObject(); if (entity instanceof AbstractStandardPO abstractStandardPO) { abstractStandardPO.setId(LamtaIdentity.generate()); updateStandard(abstractStandardPO); } } @Override public void onPersist(PersistEvent event, Map createdAlready) throws HibernateException { // ignore } @Override public void onMerge(MergeEvent event) throws HibernateException {
     //修改事件 Object entity
= event.getOriginal(); if (entity instanceof AbstractStandardPO abstractStandardPO) { updateStandard(abstractStandardPO); } } @Override public void onMerge(MergeEvent event, Map copiedAlready) throws HibernateException { // ignore }    private void updateStandard(AbstractStandardPO standardPO) { String account = null; try { RequestAttributes ra = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes sra = (ServletRequestAttributes) ra; String session = sra.getRequest().getHeader(LamtaHttpSession.Header); if (StringUtils.hasText(session)) { LamtaCurrentUserInfoA lamtaCurrentUserInfoA = sessionFactory.getSession(session) .find(LamtaCurrentUserInfoA.class).block(); account = lamtaCurrentUserInfoA != null ? lamtaCurrentUserInfoA.getAccount() : null; } } catch (Throwable e) { // } if (StringUtils.hasText(account)) { if (!StringUtils.hasText(standardPO.getCreatedById())) { standardPO.setCreatedById(account); } standardPO.setLastModifiedById(account); } } }
复制代码

实体类继承

 

 

 

posted @   笑~笑  阅读(69)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示