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); } } }
实体类继承