微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于 JPA PostgreSQL中使用 GenerationType.IDENTITY 批处理失效

@norepositoryBean
public interface BatchRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
        
    <S extends T> void saveInBatch(Iterable<S> entites);
}
@Transactional(readOnly = true)
public class BatchRepositoryImpl<T, ID extends Serializable>
        extends SimpleJpaRepository<T, ID> implements BatchRepository<T, ID> {

    private static final Logger logger = Logger.getLogger(BatchRepositoryImpl.class.getName());

    private final EntityManager entityManager;

    public BatchRepositoryImpl(JpaEntity@R_679_4045@ion entity@R_679_4045@ion,
            EntityManager entityManager) {
        super(entity@R_679_4045@ion, entityManager);

        this.entityManager = entityManager;
    }

    @Override
    @Transactional
    public <S extends T> void saveInBatch(Iterable<S> entities) {

        if (entities == null) {
            throw new IllegalArgumentException("The given Iterable of entities cannot be null!");
        }

        int i = 0;
        for (S entity : entities) {
            entityManager.persist(entity);

            i++;

            // Flush a batch of inserts and release memory
            if (i % batchSize() == 0 && i > 0) {
                logger.log(Level.INFO,
                        "Flushing the EntityManager containing {0} entities ...", i);

                entityManager.flush();
                entityManager.clear();
                i = 0;
            }
        }

        if (i > 0) {
            logger.log(Level.INFO,
                    "Flushing the remaining {0} entities ...", i);

            entityManager.flush();
            entityManager.clear();
        }
    }

    private static int batchSize() {

        int batchsize = Integer.valueOf(Dialect.DEFAULT_BATCH_SIZE); // default batch size

        Properties configuration = new Properties();
        try (InputStream inputStream = BatchRepositoryImpl.class.getClassLoader()
                .getResourceAsstream("application.properties")) {
            configuration.load(inputStream);
        } catch (IOException ex) {
            logger.log(Level.SEVERE,
                    "Cannot fetch batch size. Using further Dialect.DEFAULT_BATCH_SIZE{0}", ex);
            return batchsize;
        }

        String batchsizestr = configuration.getProperty(
                "spring.jpa.properties.hibernate.jdbc.batch_size");
        if (batchsizestr != null) {
            batchsize = Integer.valueOf(batchsizestr);
        }

        return batchsize;
    }
}

 

Why To Avoid Postgresql (BIG)SERIAL In Batching Inserts Via Hibernate

https://github.com/AnghelLeonard/Hibernate-SpringBoot/tree/master/HibernateSpringBootBatchingAndSerial

自增列 EntityManager (MysqL)

https://github.com/AnghelLeonard/Hibernate-SpringBoot/tree/master/HibernateSpringBootBatchInsertsEntityManagerBatchPerTransaction

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐