• JPA忽略更新空值配置


    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 persister, Object entity, Object target, SessionImplementor source, Map copyCache) {
            //源目标
            Object[] original = persister.getPropertyValues( entity );
            //存储目标
            Object[] targets = persister.getPropertyValues(target);
     
            Type[] types = persister.getPropertyTypes();
    
            Object[] copied = new Object[original.length];
            for ( int i = 0; i < types.length; 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 );
                }
            }
            persister.setPropertyValues( target, copied );
        }
    }
    import org.hibernate.event.service.spi.EventListenerRegistry;
    import org.hibernate.event.spi.EventType;
    import org.hibernate.internal.SessionFactoryImpl;
    import org.springframework.context.annotation.Configuration;
    
    import javax.annotation.PostConstruct;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.PersistenceUnit;
    
    @Configuration
    public class HibernateListenerConfigurer {
        @PersistenceUnit
        private EntityManagerFactory emf;
     
        @PostConstruct
        protected void init() {
            SessionFactoryImpl sessionFactory = emf.unwrap(SessionFactoryImpl.class);
            EventListenerRegistry registry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class);
            registry.getEventListenerGroup(EventType.MERGE).clear();
            registry.getEventListenerGroup(EventType.MERGE).prependListener(IgnoreNullEventListener.INSTANCE);
        }
    }
  • 相关阅读:
    Spring-Context之四:Spring容器及bean的定义
    Spring-Context之三:使用XML和Groovy DSL配置Bean
    Spring-Context之二:使用Spring提供的测试框架进行测试
    Spring-Context之一:一个简单的例子
    ActiveMQ第五弹:增加ReDelivery功能
    百度云+ KeePass 网络同步你的密码
    git生成秘钥之后同步到服务器
    谷歌chrome浏览器和火狐firefox浏览器自带http抓包工具和请求模拟插件
    ltnmp
    CentOS 下安装xdebug
  • 原文地址:https://www.cnblogs.com/i-tao/p/15590051.html
Copyright © 2020-2023  润新知