0
votes

@Transaction ne fonctionne pas dans Spring Boot 2.x et je reçois "Exécution d'une requête de mise à jour / Supprimer" lors de la mise à jour de la table

Quand j'utilise session.begintransaction () code> the TABLE MISE MISE MISE MISE MISE MISE EN PAS DE RETRAWBACK EN NOUVELLES STUCK. En supprimant session.begintransaction () code> J'ai trouvé que la table ne met pas à jour et je reçois une exception "Exécution d'une requête de mise à jour / DELETE" sur la console. Veuillez trouver ci-dessous une piste de pile complète. XXX PRE>


package com.company.jackpot.util;

import java.util.Properties;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class HibernateUtilConfig {
    /*@Value("${db.driver}")
    private String DRIVER;*/

    @Value("${db.password}")
    private String PASSWORD;

    @Value("${db.url}")
    private String URL;

    @Value("${db.username}")
    private String USERNAME;

    @Value("${hibernate.dialect}")
    private String DIALECT;

    @Value("${hibernate.show_sql}")
    private String SHOW_SQL;

    @Value("${hibernate.hbm2ddl.auto}")
    private String HBM2DDL_AUTO;

    @Value("${entitymanager.packagesToScan}")
    private String PACKAGES_TO_SCAN;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
       // dataSource.setDriverClassName(DRIVER);
        dataSource.setUrl(URL);
        dataSource.setUsername(USERNAME);
        dataSource.setPassword(PASSWORD);
        return dataSource;
    }

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(PACKAGES_TO_SCAN);
        Properties hibernateProperties = new Properties();
        hibernateProperties.put("hibernate.dialect", DIALECT);
        hibernateProperties.put("hibernate.show_sql", SHOW_SQL);
        hibernateProperties.put("hibernate.hbm2ddl.auto", HBM2DDL_AUTO);
        sessionFactory.setHibernateProperties(hibernateProperties);

        return sessionFactory;
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());
        return transactionManager;
    }
}




package com.company.jackpot.dao.impl;

import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.company.jackpot.beans.RequestBean;
import com.company.jackpot.beans.ResponseBean;
import com.company.jackpot.dao.JackpotDao;
import com.company.jackpot.model.CurrentValue;
import com.company.jackpot.model.TransactionMaster;
import com.company.jackpot.model.TransactionWin;
import com.company.jackpot.model.enummodel.Level;
import com.company.jackpot.util.CommonOperation;

@Repository
//@Transactional(rollbackOn = {ArrayIndexOutOfBoundsException.class})
public class JackpotDaoImpl implements JackpotDao {

    @Autowired
    private SessionFactory sessionFactory;
    ResponseBean responseBean = new ResponseBean();

    @Override
    public ResponseBean getJackpot(RequestBean requestBean) {

        Session session = null;
        //Transaction tx = null;
        try {
            //session = sessionFactory.openSession();
            //tx = session.beginTransaction();

            String hql = "select setId from SetReference where serviceCode = '" + requestBean.getServiceCode()
                    + "' and gameCode = " + requestBean.getGameCode() + "";
            Query query = session.createQuery(hql);
            List<Integer> queryResultList = query.list();
            if (!queryResultList.isEmpty()) {

                int setId = queryResultList.get(0);
                getSetDetail(setId, requestBean, session);
                //int i = 2;

                //session.getTransaction().commit();
                //tx.commit();

                return responseBean;
            } else {
                responseBean.setErrorCode(401);
                responseBean.setErrorMsg("You are not eligible for jackpot");
//              session.getTransaction().commit();
                return responseBean;
            }
        } catch (RuntimeException e) {
            e.printStackTrace();
        }
        return null;
    }

    public void getSetDetail(int setId, RequestBean requestBean, Session session) {

        try {
            String setDetailQuery = "select setId, level, type, contributionPercentage, startRange, endRange from SetDetail where setId = "
                    + setId + "";
            Query query = session.createQuery(setDetailQuery);
            List<Object[]> setDetailQueryList = query.list();
            if (!setDetailQueryList.isEmpty()) {
                for (Object[] setDetail : setDetailQueryList) {
                    // SetDetail setDetail = (SetDetail)set;
                    Double start = (double) setDetail[4];
                    Double end = (double) setDetail[5];
                    int randomNumber = CommonOperation.getRandomNumber(start.intValue(), end.intValue());
                    Double contributionPercentage = (double) setDetail[3];
                    Double contributionValue = CommonOperation.getContributionValue(requestBean.getBetAmount(),
                            contributionPercentage.intValue());
                    if (setDetail[1].toString().equalsIgnoreCase("MACHINE")) {
                        /*
                         * from here take random and contribution and then update current_value table
                         * txn_master, txn_win
                         */
                        System.out.println(setDetail[1]);
                        updateCurrentValue((int) setDetail[0], setDetail[1].toString(), setDetail[2].toString(),
                                randomNumber, contributionValue, requestBean.getMachineId(), requestBean, session);

                    }

                }
            }

        } catch (RuntimeException e) {
            e.printStackTrace();
        }
    }

    public void updateCurrentValue(int setId, String level, String type, int randomNumber, double contributionValue,
            String levelId, RequestBean requestBean, Session session) {
            long transactionId;

        try {
            String hql = "from CurrentValue where setId = " + setId + " and level = '" + level + "' and levelId = '"
                    + levelId + "'";
            Query query = session.createQuery(hql);
            List<CurrentValue> currentValueList = query.list();
            for (CurrentValue currentValue : currentValueList) {
                System.out.println(currentValue);

                if (currentValue.getEligiblePrice() == null) {
                    responseBean.setJackpotType(null);
                    responseBean.setWinningAmount(null);
                    String updateHQl = "update CurrentValue set eligiblePrice = :price, totalContributionValue = :value where setId = "
                            + setId + " and level = '" + level + "' and levelId = '" + levelId + "'";

                    Query updateQuery = session.createQuery(updateHQl);
                    updateQuery.setParameter("price", (double) randomNumber);
                    updateQuery.setParameter("value", (currentValue.getTotalContributionValue() + contributionValue));
                    int rowsAffected = updateQuery.executeUpdate();
                    if (rowsAffected > 0) {
                        System.out.println(rowsAffected + " Affected");
                        // now update txn_master, txn_win
                        transactionId = updateTransactionMaster(setId, requestBean, session);
                        System.out.println(5/0);



                }   }
            }
        } catch (RuntimeException e) {
            e.printStackTrace();
        }

    }

}


0 commentaires

4 Réponses :


1
votes

Vous utilisez @TransAderal qui est géré le conteneur mais démarrait manuellement une session dans le @Repository . Cela gâchre les choses.

n'ouvre pas la session explicitement dans ce cas. Par défaut, tous les RunTimeExceptions entraîneront une restauration. Si vous souhaitez rétablir une exception vérifiée, vous devez vous configurer que sur le niveau d'annotation @Transactional .


1 commentaires

Si une session explicitement n'est pas une option, comment puis-je obtenir l'objet de session. Si vous pouvez expliquer par n'importe quel exemple de code, veuillez partager



0
votes

Vous utilisez un démarrage à ressort (en fonction des balises que vous avez ajoutées), cependant que votre code et votre configuration montrent que vous essayez très fort de travailler autour du cadre.

fossé votre hibernatetutilconfig code> ajoutez le suivant que l'application .properties.properties code>. p> xxx pré>

Ceci est le remplacement de votre hibernatetutilconfig code> et suppose que votre classe annotée code> @springbootaPlication est dans un package de niveau supérieur. Sinon, ajoutez un @enttityScan code> (bien qu'il soit recommandé de le mettre dans un package de niveau supérieur). P>

à la place de la section SessionFactory CODE> et Session CODE> Utilisez JPA avec le EntityManager Code> dans votre référentiel. P>

@Repository
public class JackpotDaoImpl implements JackpotDao {

    @PersistenceContext
    private EntityManager em;


0 commentaires

0
votes

J'ai eu la solution que le problème est dans le moteur de base de données MySQL. Mon moteur était Myisam qui ne prend pas en charge les transactions de restauration. J'ai changé mon moteur de base de données à Innodb et ça marche bien.

Alter Table Table_Name Engine = Innodb;


0 commentaires

0
votes

Vous devez ajouter @Transactional code> Annotation à vos méthodes de mise à jour ou Supprimer la requête.

Par exemple dans votre UpdateCurrentValueValue forte> Souriez être comme ça: P >

@Transactional
public void updateCurrentValue(...){
    //...
}


0 commentaires