Hibernate & Printemps: Exception lors de la tentative de créer une transaction
Donc je suis en train d'utiliser le Printemps pour gérer hibernate transactions pour la première fois, et quelque chose ne va pas. Je ne suis pas sûr de ce que. J'ai regardé un tas de réponses semblables sur ce site et rien de ce que j'ai vu semble être de droite.
Donc, je vais copier et coller un tas de mon code avec des explications et demander de l'aide ici.
Ici est une trace de la pile de l'exception que je suis. Essentiellement, Il semble que c'est en essayant de trouver des org.mise en veille prolongée.moteur.des transactions.le spi.transactioncontext, et ne le peuvent pas.
Trace de pile d'Exception
EXCEPTION: Could not open Hibernate Session for transaction; nested exception is java.lang.NoClassDefFoundError: org/hibernate/engine/transaction/spi/TransactionContext
org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:544)
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:427)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:276)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
com.sun.proxy.$Proxy42.getSavedPortfolios(Unknown Source)
io.craigmiller160.stockmarket.controller.StockMarketController.showOpenPortfolioDialog(StockMarketController.java:994)
io.craigmiller160.stockmarket.controller.StockMarketController.parseEvent(StockMarketController.java:431)
io.craigmiller160.stockmarket.controller.StockMarketController.processEvent(StockMarketController.java:336)
io.craigmiller160.mvp.concurrent.AbstractConcurrentListenerController$1.run(AbstractConcurrentListenerController.java:209)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
Maintenant, j'ai cherché sur ce site, et la grande chose que j'ai vu, c'est que cela signifie que j'ai une dépendance de mal dans ma pom.xml. Le truc, c'est que j'ai le plus up-to-date de la version de la mise en veille prolongée-core de la dépendance dans mon pompon. De ce que j'ai lu, c'est ce dont j'ai besoin pour cette classe.
pom.xml dépendances
<dependencies>
<!-- JUnit Testing -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- MVP Framework -->
<dependency>
<groupId>io.craigmiller160.mvp</groupId>
<artifactId>mvp-framework</artifactId>
<version>2.1.1</version>
</dependency>
<!-- MigLayout -->
<dependency>
<groupId>com.miglayout</groupId>
<artifactId>miglayout-swing</artifactId>
<version>5.0</version>
</dependency>
<!-- JFreeChart -->
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.0.19</version>
</dependency>
<!-- Java Concurrency In Practice Annotations -->
<dependency>
<groupId>net.jcip</groupId>
<artifactId>jcip-annotations</artifactId>
<version>1.0</version>
</dependency>
<!-- Joda Time -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.8.2</version>
</dependency>
<!-- MySQL ConnectorJ -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
<!-- Spring Framework Core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring Framework Beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring Framework Context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Hibernate Core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.1.Final</version>
</dependency>
<!-- XML Framework -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<!-- Code Generation library -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
<!-- Apache Commons Logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- LOG4J API -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- LOG4J Core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- SLF4J/LOG4J Binding -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- LOG4J/Commons Logging Binding -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- SLF4J API -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<!-- Spring ORM -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- AspectJ Runtime -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<!-- AspectJ Weaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<!-- Apache Database Connection Pooling -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
Aussi, je suis en ajoutant la méthode dans mon DAO que je vais appeler. Cette méthode est ce que tente de s'exécuter lorsque l'exception est levée.
Méthode DAO:
@Transactional
@Override
@SuppressWarnings("unchecked") //hibernate list() method doesn't support generics
public List<String> getSavedPortfolios() throws HibernateException {
List<String> portfolioNames = new ArrayList<>();
List<SQLPortfolioModel> portfolioList = sessionFactory.getCurrentSession()
.createCriteria(PortfolioModel.class)
.list();
for(SQLPortfolioModel portfolio : portfolioList){
int id = portfolio.getUserID();
String name = portfolio.getPortfolioName();
BigDecimal netWorth = portfolio.getNetWorth();
Calendar timestamp = portfolio.getTimestamp();
String fileName = String.format("%1$d-%2$s-%3$s-"
+"%4$s", id, name, moneyFormat.format(netWorth),
timestampFormat.format(timestamp.getTime()));
portfolioNames.add(fileName);
}
return portfolioNames;
}
Enfin, voici mon spring-context-data.xml. Il contient toute la configuration pour mes données haricots pour le printemps, en plus de la transaction trucs:
spring-context-data.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- Sets annotation-driven transactions -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- DataSource object for providing database connections -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/stockmarket"/>
<property name="username" value="stockmarket"/>
<property name="password" value="stockmarket"/>
</bean>
<!-- SessionFactory object for creating sessions for database access -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- <property name="configLocation" value="classpath:hibernate.cfg.xml"/>-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="connection.pool_size">1</prop>
<prop key="show_sql">false</prop>
<!-- Might need this one below for transactions, not sure yet -->
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>io.craigmiller160.stockmarket.stock.AbstractStock</value>
<value>io.craigmiller160.stockmarket.stock.OwnedStock</value>
<value>io.craigmiller160.stockmarket.stock.DefaultStock</value>
<value>io.craigmiller160.stockmarket.stock.DefaultOwnedStock</value>
<value>io.craigmiller160.stockmarket.model.PortfolioModel</value>
<value>io.craigmiller160.stockmarket.model.SQLPortfolioModel</value>
</list>
</property>
</bean>
<!-- Hibernate Transaction Manager -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- HibernateDAO class for performing database operations -->
<bean id="hibernateDao" class="io.craigmiller160.stockmarket.controller.HibernatePortfolioDAO"
destroy-method="closeFactory">
<constructor-arg ref="sessionFactory"/>
</bean>
</beans>
Donc j'ai juste aucune idée de pourquoi cela se passe. J'ai le double et le triple vérifié ce que j'ai fait par rapport à ce que je vois en ligne, et je ne vois pas l'erreur. C'est ma première fois d'essayer d'utiliser le Printemps, la gestion des transactions. Toute aide serait grandement appréciée.
PS. Je suis l'aide de Printemps 4 & Hibernate 5 ensemble, si cela fait une différence.
LocalSessionFactoryBean
ou de passer à hibernate4La version de Printemps 4 avez-vous exactement? Seulement le Printemps 4.2 et à la hausse de soutien Hibernate 5. Si vous avez le Printemps 4.1, vous pouvez utiliser Hibernate 4.3 version le plus élevé.
Si la modification de la veille prolongée gestionnaire de transactions et de la session de l'usine ne fonctionne pas, essayez de changer votre mysql connector vers la version 5.1.46 de 5.1.36 ici dans votre pom xml : <dépendance> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.36< version> </dépendance>
OriginalL'auteur user2223059 | 2015-10-01
Vous devez vous connecter pour publier un commentaire.
Dans votre POM vous êtes en fonction sur Hibernate 5, mais dans votre gestionnaire de transactions, vous êtes en utilisant Hibernate 4.
Changer votre transacation manager pour correspondre à votre pom (c'est à dire à partir de hibernate4 à hibernate5):
Si cela provoque une classe ne trouve pas d'erreur, de mise à niveau de votre printemps cadre de l'article 4.2.2
Elle ressemble à ça c'est la bonne réponse, mais pouvez-vous traduire* à @mode annotation, Votre réponse bien plus parfait et utile... et merci.
M'a sauvé un jour 🙂
Sauvé ma soirée! 😉 merci....Pour les personnes utilisant des annotations, jetez un oeil à votre importations: import org.springframework.orm.hibernate5.HibernateTransactionManager;
Chamberlain s'il vous Plaît ajouter à votre réponse une note assurez-vous de définir également la sessionFactory si nécessaire: <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
OriginalL'auteur Tom Chamberlain
La classe, il est à la recherche d'est en se référant à une classe qui n'existe que dans Hibernate 4.x
http://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/engine/transaction/spi/package-summary.html
Mais pas plus de 5.x
http://docs.jboss.org/hibernate/orm/5.0/javadocs/org/hibernate/engine/transaction/spi/package-summary.html
Donc je pense que vous pourriez être un mélange Hibernate 4 et 5 dépendances. Je ne pense pas que vous pouvez simplement passer à la version d'hibernate, sans examen de l'ensemble de ses dépendances.
Eureka! Cela a fonctionné, merci beaucoup. Donc, reste seul bug, c'est que maintenant, certains d'hibernate sur l'exploitation forestière est en cours d'impression dans la console plutôt que d'être acheminés vers mon fileAppender dans log4j2. Ce n'était pas le cas lorsque j'étais à l'aide de la version 5. Mon POM a les dépendances je dois veiller à ce que tous les slf4j la journalisation est routée correctement, toute idée de ce qui se passe? (Petit détail, je sais, mais je suis très soucieux du détail)
"certains de hibernate enregistrement" est quoi exactement? Je préfère sans doute ouvrir une nouvelle question sur stackoverflow pour cela, de sorte qu'il obtient le droit d'attention et vous pouvez poster des exemples de configs.
OriginalL'auteur seba.wagner
Vous êtes en utilisant hibernate-5, mais vous demandons de printemps à utiliser hibernate-4 sessionFactory
et gestionnaire de transactions
OriginalL'auteur beannayak
Ne sais pas si c'est le problème, mais puisque vous pensez que quelque chose est liée à la pom.xml essayez d'ajouter de l'hibernation de l'entité gestionnaire de la dépendance. J'ai comparé votre pom.xml avec la mienne et, en ce qui concerne les hibernate dépendances, c'est le manque.
ici, mvnrepository.com/artifact/org.hibernate/...
OriginalL'auteur Luan Rios Campos
J'ai fait le même problème et mon problème résolu par la mise à jour
OriginalL'auteur krishan kansal