实现DefaultMergeEventListener
import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.event.internal.DefaultMergeEventListener;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.property.access.internal.PropertyAccessStrategyBackRefImpl;
import org.hibernate.type.Type;
import java.util.Map;
public class IgnoreNullEventListener extends DefaultMergeEventListener {
public static final IgnoreNullEventListener INSTANCE = new IgnoreNullEventListener();
@Override
protected void copyValues(EntityPersister persistent, Object entity, Object target,
SessionImplementor source, Map copyCache) {
Object[] original = persistent.getPropertyValues(entity);
Object[] targets = persistent.getPropertyValues(target);
Type[] types = persistent.getPropertyTypes();
Object[] copied = new Object[original.length];
int len = types.length;
for (int i = 0; i < len; i++) {
if (original[i] == null ||
original[i] == LazyPropertyInitializer.UNFETCHED_PROPERTY ||
original[i] == PropertyAccessStrategyBackRefImpl.UNKNOWN
) {
copied[i] = targets[i];
} else {
copied[i] = types[i].replace(original[i], targets[i], source, target, copyCache);
}
}
persistent.setPropertyValues(target, copied);
}
}
注册监听器
@Configuration
public class HibernateListenerConfigurer {
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
@PostConstruct
protected void init() {
SessionFactoryImpl sessionFactory = entityManagerFactory.unwrap(SessionFactoryImpl.class);
EventListenerRegistry registry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class);
registry.getEventListenerGroup(EventType.MERGE).clear();
registry.getEventListenerGroup(EventType.MERGE).prependListener(IgnoreNullEventListener.INSTANCE);
}
}