java – Hibernate&Spring:嘗試建立事務時出現異常
所以我試圖使用Spring來首次管理hibernate的事務,而且出了問題.我不知道是什麼我在這個網站上看了一堆類似的答案,沒看到什麼似乎是對的.
所以,我將複製並貼上一堆我的程式碼一些解釋,並在這裡請求幫助.
這是我得到的異常的堆疊跟蹤.本質上來說,它似乎試圖找到org.hibernate.engine.transaction.spi.transactioncontext,而不能.
異常堆疊跟蹤
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)
現在,我搜索了這個網站,我看到的最重要的是這意味著我的pom.xml中有一個依賴錯誤.事情是,我的pom中有最新版本的hibernate-core依賴項.從我讀過的,這就是我需要的這個類.
pom.xml依賴關係
<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> <!-- SQL/">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>
此外,我在我打電話的DAO中添加了實際的方法.該方法是在丟擲異常時嘗試執行的方法.
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; }
最後,這裡是我的spring-context-data.xml.它包含我的資料bean的所有配置為spring,加上事務的東西:
彈簧上下文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>
所以我不知道為什麼會發生這種情況.我有兩倍三重的檢查我做了什麼,我在網上看到,我看不到錯誤.這是我第一次嘗試使用Spring事務管理.任何幫助將不勝感激.
PS.我正在使用Spring 4&一起休眠5,如果有所作為.
在您的POM中,您依賴於Hibernate 5,但在事務管理器中,您正在使用Hibernate 4.
改變你的交易經理來匹配你的pom(即從hibernate4到hibernate5):
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean>
如果導致類沒有找到錯誤,請將您的彈簧框架升級到4.2.2
http://stackoverflow.com/questions/32898333/hibernate-spring-exception-when-trying-to-create-a-transaction