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