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.
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();
}
}
}
4 Réponses :
Vous utilisez n'ouvre pas la session explicitement dans ce cas. Par défaut, tous les @TransAderal code> qui est géré le conteneur mais démarrait manuellement une session dans le
@Repository code>. Cela gâchre les choses. p>
RunTimeExceptions code> entraîneront une restauration. Si vous souhaitez rétablir une exception vérifiée, vous devez vous configurer que sur le niveau d'annotation code> @Transactional code>. P>
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
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 Ceci est le remplacement de votre à la place de la section hibernatetutilconfig code> ajoutez le suivant que l'application
.properties.properties code>. p>
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>
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;
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. P>
Alter Table Table_Name Engine = Innodb; P>
Vous devez ajouter Par exemple dans votre @Transactional code> Annotation à vos méthodes de mise à jour ou Supprimer la requête.
@Transactional
public void updateCurrentValue(...){
//...
}