¿Por qué mi lista de entidades no persiste en mi base de datos H2 usando JPA

Tengo una clase de dao H2 que define mi método de persistencia para insertar datos en mi base de datos h2. Cuando llamo mi método de mi clase de validador (H2Impl.insertMyData(batchID, promoList)), nada parece ocurrir y no se persisten datos en mi base de datos. Estoy llamando nativamente a mi consulta desde un archivo de propiedades, y estableciendo los parámetros de mi frijol de persistencia.

Tengo debajo de mi frijol de persistencia, mi dao, mi validador y mi consulta. propiedades archivo con la consulta. Todo eso está en mi base de datos H2:

Persistence Bean class:

@Entity
public class InsertPromoData {

    @Id
    @Column(name="row_num")
    String rowNumber;

    @Column(name="BATCH_ID")
    String batchID;
    
    @Column(name="ITEM")
    String item;
    
    @Column(name="LOC")
    String loc;
    
    @Column(name="WK_START")
    String wkStart;
    
    @Column(name="NUM_OF_WEEKS")
    String numberOfWeeks;
    
    @Column(name="TYPE")
    String type;
    
    @Column(name="FCSTID")
    String fcstId;
    
    @Column(name="QTY")
    String qty;
    
    @Column(name="INSERT_TS")
    String insertTS;

    public String getRowNumber() {
        return rowNumber;
    }

    public void setRowNumber(String rowNumber) {
        this.rowNumber = rowNumber;
    }

    public String getBatchID() {
        return batchID;
    }

    public void setBatchID(String batchID) {
        this.batchID = batchID;
    }

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }

    public String getLoc() {
        return loc;
    }

    public void setLoc(String loc) {
        this.loc = loc;
    }

    public String getWkStart() {
        return wkStart;
    }

    public void setWkStart(String wkStart) {
        this.wkStart = wkStart;
    }

    public String getNumberOfWeeks() {
        return numberOfWeeks;
    }

    public void setNumberOfWeeks(String numberOfWeeks) {
        this.numberOfWeeks = numberOfWeeks;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getFcstId() {
        return fcstId;
    }

    public void setFcstId(String fcstId) {
        this.fcstId = fcstId;
    }

    public String getQty() {
        return qty;
    }

    public void setQty(String qty) {
        this.qty = qty;
    }

    public String getInsertTS() {
        return insertTS;
    }

    public void setInsertTS(String insertTS) {
        this.insertTS = insertTS;
    }
}

H2Impl DAO class:

@Configuration // Needs to be a configuration
@PropertySources({ @PropertySource("classpath:sql/query.properties") })
public class H2Impl {
    private static Logger logger = LogManager.getLogger(H2Impl.class);
    private static EntityManagerFactory emf;
    private static Environment env;

    public static void setMyConfig(EntityManagerFactory emf, Environment env) {
        H2Impl.emf = emf;
        H2Impl.env = env;

    }

  public static void insertPromoData(String batchId, List insertData) {
      //public static List insertPromoData(String batchId, List insertData) {
      logger.debug("Execution of method insertPromoData in Dao started");
      
      List insertPromo = new ArrayList<>();
      EntityManager em = emf.createEntityManager();
      EntityTransaction et = em.getTransaction();
        //logic to select the max_row number before executing the insert query
        //counter to see if after 1000 the mod is x % 1000 = 0 then commit
      try {
          et.begin();
          for (InsertPromoData promoData : insertData) {
                    
              Query query = em.createNativeQuery(env.getProperty("insertPromoUploadData"));
              query.setParameter("item", promoData.getItem());
              query.setParameter("loc", promoData.getLoc());
              query.setParameter("wkStart", promoData.getWkStart());
              query.setParameter("numberOfWeeks", promoData.getNumberOfWeeks());            
              query.setParameter("type", promoData.getType());
              query.setParameter("fcstId", promoData.getFcstId());
              query.setParameter("qty", Double.valueOf(promoData.getQty()));
              em.persist(promoData);
              em.flush();
          }
          //insertPromo = insertData;
          et.commit();
      }
      catch(Exception e) {
          logger.error("Exception in beginning transaction");
          e.printStackTrace();
      }
      finally {
          em.clear();
          em.close();
      }
        
      logger.debug("Execution of method insertPromoData in Dao ended");
      //return insertPromo;
  }
}

Clase de validación (existencia de clase obrera, pero la lógica de mi persistencia comienza abajo):

        promo.forEach(record -> {
        
        if (record.getErrorList().size() == 0) {
            rowsSuccessful++;
            record.setNumber_Of_Weeks(record.getNumber_Of_Weeks());
            record.setForecast_ID(record.getForecast_ID());
            record.setType(record.getType());
            record.setUnits(record.getUnits());
            record.setWeek_Start_Date(record.getWeek_Start_Date());
            for (InsertPromoData insertPromoData : insertPromos) {
                
                insertPromoData.setItem(record.getItem());
                insertPromoData.setLoc(record.getLoc());
                insertPromoData.setWkStart(record.getWeek_Start_Date());
                insertPromoData.setNumberOfWeeks(record.getNumber_Of_Weeks());
                insertPromoData.setType(record.getType());          
                insertPromoData.setFcstId(record.getForecast_ID());
                insertPromoData.setQty(record.getUnits());
            }
        );
    
        H2Impl.insertPromoData(batchID, insertPromos);

Mi consulta. entrada de propiedades:

insertPromoUploadData =INSERT INTO TEST.U_USER_PROMO (BATCH_ID,ITEM,LOC,WK_START,NUM_OF_WEEKS,TYPE,FCSTID,QTY,INSERT_TS) VALUES (:batchId,:item,:loc,:wkStart,:numberOfWeeks,:type,:fcstId,:qty,CURRENT_TIMESTAMP)

¿Hay alguna razón por la que nada sucede cuando llamo el método de persistencia?

Pregunta hecha hace 3 años, 4 meses, 28 días - Por techtactician


2 Respuestas:

  • Hay un error en tu método de persistencia insertPromoData en tu clase H2Impl. En tu bucle for estás utilizando la variable InsertPromoData promoData en lugar de la lista List<InsertPromoData> insertData que pasas como parámetro al método. Por lo tanto, estás utilizando un objeto incorrecto para setear los parámetros de la consulta y para persistir los datos.

    Aquí te dejo el código corregido:

    java
    public static void insertPromoData(String batchId, List insertData) {
        logger.debug("Execution of method insertPromoData in Dao started");
    
        EntityManager em = emf.createEntityManager();
        EntityTransaction et = em.getTransaction();
    
        try {
            et.begin();
            for (InsertPromoData promoData : insertData) {
                Query query = em.createNativeQuery(env.getProperty("insertPromoUploadData"));
                query.setParameter("batchId", batchId);
                query.setParameter("item", promoData.getItem());
                query.setParameter("loc", promoData.getLoc());
                query.setParameter("wkStart", promoData.getWkStart());
                query.setParameter("numberOfWeeks", promoData.getNumberOfWeeks());            
                query.setParameter("type", promoData.getType());
                query.setParameter("fcstId", promoData.getFcstId());
                query.setParameter("qty", Double.valueOf(promoData.getQty()));
                query.setParameter("insertTS", new Date());
    
                query.executeUpdate();
            }
            et.commit();
        } catch(Exception e) {
            logger.error("Exception in beginning transaction");
            e.printStackTrace();
        } finally {
            em.close();
        }
    
        logger.debug("Execution of method insertPromoData in Dao ended");
    }
    

    En este código corregido, estoy utilizando el objeto promoData del bucle for para setear los parámetros de la consulta y ejecutar la inserción de datos en la base de datos.

    Por favor, inténtalo de nuevo con esta corrección y verifica si ahora los datos se persisten correctamente en tu base de datos H2.

    Respondida el Dec 18, 2020 a las 20:57 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • métodoóp⣼>classNameweeks()).将他onedDateTime,ResponseType>ResponseType>ResponseType>serdeauteResponseType>

    Respondida el Dec 18, 2020 a las 21:01 - por Gemini

    Votos positivos: 0 | Votos negativos: 0