package com.youchain.utils;

import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;

@Component
public class BatchCreateOrUpdate {

    @PersistenceContext
    private EntityManager entityManager;

    /**
     * 批量插入实体。
     *
     * @param entities 要插入的实体列表
     * @param <T>      实体类型
     */
    @Transactional(rollbackFor = Exception.class)
    public <T> void batchCreate(List<T> entities) {
        int batchSize = 100;
        if (entities == null || entities.isEmpty()) {
            return;
        }

        int i = 0;
        for (T entity : entities) {
            entityManager.persist(entity);
            i++;
            if (i % batchSize == 0) {
                // 执行flush将实体状态同步到数据库，并清理持久化上下文
                entityManager.flush();
                entityManager.clear();
            }
        }

        // 确保最后未达到batchSize的数据也能被flush到数据库
        if (i % batchSize != 0) {
            entityManager.flush();
            entityManager.clear();
        }
    }


    /**
     * 批量更新实体。
     *
     * @param entities 要更新的实体列表
     * @param <T>      实体类型
     */
    @Transactional(rollbackFor = Exception.class)
    public <T> void batchUpdate(List<T> entities) {
        int batchSize = 100;
        if (entities == null || entities.isEmpty()) {
            return;
        }

        int i = 0;
        for (T entity : entities) {
            entityManager.merge(entity);
            i++;
            if (i % batchSize == 0) {
                // 执行flush和clear以同步状态到数据库并清理上下文，减少内存使用
                entityManager.flush();
                entityManager.clear();
            }
        }

        if (i % batchSize != 0) {
            entityManager.flush();
            entityManager.clear();
        }
    }

}
