0

I'm starting to develop an application, trying to integrate Hibernate and Spring. I looked at the other threads regarding this problem, but none of the proposed solutions helped me.

Here's my pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>my.organization.cs</groupId>
<artifactId>call_center_basic</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>

<name>call_center_basic</name>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java-version>1.7</java-version>
    <org.springframework-version>4.0.0.RELEASE</org.springframework-version>
    <org.aspectj-version>1.7.1</org.aspectj-version>
    <slf4j.version>1.6.4</slf4j.version>
</properties>

<dependencies>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.2.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${org.springframework-version}</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${org.springframework-version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>${org.aspectj-version}</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.0.0.GA</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>4.0.0.GA</version>
        <exclusions>
            <exclusion>
                <artifactId>slf4j-api</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.0.Final</version>
        <exclusions>
            <exclusion>
                <artifactId>slf4j-api</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.0-api</artifactId>
        <version>1.0.1.Final</version>
        <exclusions>
            <exclusion>
                <artifactId>slf4j-api</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-tools</artifactId>
        <version>3.2.0.beta8</version>
        <exclusions>
            <exclusion>
                <artifactId>slf4j-api</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jul-to-slf4j</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>my.organization.cs</groupId>
        <artifactId>call_center_config</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <exclusions>
            <exclusion>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-tools</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <configuration>
                        <tasks>
                            <taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask"
                                classpathref="maven.plugin.classpath" />

                            <hibernatetool destdir="target/generated-sources">
                                <jdbcconfiguration
                                    propertyfile="../call_center_config/src/main/resources/ro/ubbcluj/cs/call_center_config/persistence/hibernate.properties"
                                    packagename="my.organization.cs.call_center_basic.model"
                                    revengfile="../call_center_config/src/main/resources/ro/ubbcluj/cs/call_center_config/persistence/reveng/model.reveng.xml"
                                    reversestrategy="my.organization.cs.call_center_config.reveng.util.BaseReverseEngineeringStrategy" />
                                <hbm2java jdk5="true" ejb3="true" />
                                <hbmtemplate templatepath="../call_center_config/hibernate/templates/pojo"
                                    template="Pojo.ftl" filepattern="{package-name}/{class-name}.java">
                                    <property key="jdk5" value="true" />
                                    <property key="ejb3" value="true" />
                                </hbmtemplate>
                                <property key="hibernatetool.commentformatter.toolclass"
                                    value="my.organization.cs.call_center_config.reveng.util.CommentFormatter" />
                            </hibernatetool>
                            <!-- Disable CascadeType.ALL -->
                            <replace dir="target/generated-sources">
                                <include name="**/Category.java" />
                                <replacefilter token="cascade=CascadeType.ALL, "
                                    value="" />
                            </replace>
                        </tasks>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>cglib</groupId>
                    <artifactId>cglib</artifactId>
                    <version>2.2</version>
                </dependency>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.6</version>
                </dependency>
                <dependency>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                    <version>1.1.1</version>
                </dependency>
                <dependency>
                    <groupId>my.organization.cs</groupId>
                    <artifactId>call_center_config</artifactId>
                    <version>0.0.1-SNAPSHOT</version>
                    <exclusions>
                        <exclusion>
                            <groupId>org.hibernate</groupId>
                            <artifactId>hibernate-tools</artifactId>
                        </exclusion>
                        <exclusion>
                            <groupId>org.hibernate</groupId>
                            <artifactId>hibernate-core</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>
                <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-tools</artifactId>
                    <version>3.2.4.GA</version>
                    <scope>compile</scope>
                </dependency>
                <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-core</artifactId>
                    <version>3.3.2.GA</version>
                    <scope>compile</scope>
                </dependency>
                <dependency>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                    <version>${slf4j.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                    <version>${slf4j.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.slf4j</groupId>
                    <artifactId>jul-to-slf4j</artifactId>
                    <version>${slf4j.version}</version>
                </dependency>
            </dependencies>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.2</version>
            <configuration>
                <source>${java-version}</source>
                <target>${java-version}</target>
                <!-- <skip>true</skip> -->
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.2</version>
            <configuration>
                <skipTests>false</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.8</version>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>add-source</goal>
                    </goals>
                    <configuration>
                        <sources>
                            <source>target/generated-sources</source>
                        </sources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.5</version>
            <configuration>
                <warName>call_center_basic</warName>
                <webXml>src/main/resources/WEB-INF/web.xml</webXml>
            </configuration>
        </plugin>
    </plugins>
</build>

Here's my spring-persistence-config.xml

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
                    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
                    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
                    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">


<context:annotation-config />

<tx:annotation-driven transaction-manager="transactionManager" />

<context:property-placeholder
    ignore-unresolvable="true"
    location="classpath:my/organization/cs/call_center_config/persistence/hibernate.properties"/>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="transactionTemplate"
    class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager" />
</bean>


<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${hibernate.connection.driver_class}" />
    <property name="url" value="${hibernate.connection.url}" />
    <property name="username" value="${hibernate.connection.username}" />
    <property name="password" value="${hibernate.connection.password}" />
    <property name="accessToUnderlyingConnectionAllowed" value="true" />
    <property name="validationQuery" value="select 1" />
    <property name="minIdle" value="0" />
    <property name="maxIdle" value="10" />
    <property name="maxActive" value="10" />
    <property name="maxWait" value="20000" />
    <property name="minEvictableIdleTimeMillis" value="120000" />
    <property name="timeBetweenEvictionRunsMillis" value="10000" />
    <property name="numTestsPerEvictionRun" value="3" />
    <property name="removeAbandonedTimeout" value="60" />
    <property name="removeAbandoned" value="true" />
    <property name="logAbandoned" value="true" />
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
    <property name="hibernateProperties">
        <value>
            hibernate.format_sql=true
            hibernate.show_sql=false
            hibernate.use_sql_comments=true
            hibernate.dialect=${hibernate.dialect}
            hibernate.jdbc.batch_size=1000
            hibernate.order_inserts=true
            hibernate.order_updates=true
            hibernate.cache.use_second_level_cache=false
            hibernate.default_schema=${hibernate.default_schema}
            hibernate.default_catalog=${hibernate.default_catalog}
            hibernate.current_session_context_class=thread
        </value>
    </property>
</bean>

Now, the exception happens, when I was trying to test if everything is set up correctly and I can get an entity from the DB.

Here's the JUnit test that I execute:

package my.organization.cs.call_center_basic.dao;

import static org.junit.Assert.assertNotNull;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import my.organization.cs.call_center_basic.model.Institute;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:my/organization/cs/call_center_basic/persistence/system-test-config.xml",
                "classpath:my/organization/cs/call_center_basic/persistence/spring-persistence-config.xml" })
@Transactional
public class TestInstituteDao {

    @Autowired
    InstituteDao instituteDao;

    @Test
    public void testGetById(){
        Institute institute = instituteDao.getById(1L);
        assertNotNull(institute);
        System.out.println(institute.toString()); 
    }
}

Also, here's my whole stack trace:

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/Session;
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:517)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.startTransaction(TransactionalTestExecutionListener.java:587)
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.startNewTransaction(TransactionalTestExecutionListener.java:273)
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:168)
    at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:363)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/Session;
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:417)
    ... 25 more

Does anyone know what's wrong here? Please help me out, I've been stuck here for hours.

Thanks!

LucasP
  • 1,665
  • 16
  • 24
Boti
  • 1
  • 1
  • 2
  • java.lang.NoSuchMethodError occurs when you have an interface or abstract class without an implementation and you try to call the method on it. Make sure that the correct jars(with correct versions) are present in the build. – StackFlowed May 21 '15 at 19:56
  • Yes, I know why it happens. I tried a whole set of different combinations, but none of them worked so far. – Boti May 21 '15 at 19:57
  • Can you copy your entire stack trace. – StackFlowed May 21 '15 at 19:57
  • 1
    Looks like it might be a mismatch of hibernate versions. I see hibernate-tools at 3.2.0-beta8, but you are using hibernate 4.3. There is also a hibernate-core at version 3.3.2.GA, and another hibernate-tools at version 3.2.4.GA in your pom. I would try making sure all hibernate versions were correct. – LucasP May 21 '15 at 19:58
  • See this if it can help you: http://stackoverflow.com/questions/8799121/java-lang-nosuchmethoderror-org-hibernate-sessionfactory-opensessionlorg-hibe?rq=1 – The Guest May 21 '15 at 20:03
  • @LucasP, the hibernate-core 3.3.2.GA and hibernate-tools 3.2.4.GA are there only for the antrun plugin. I'm generating my entity classes from the db and my ftl files are not working with hibernate 4.3. – Boti May 21 '15 at 20:07
  • I'm almost certain this error occurs when `org.springframework.orm.hibernate4.LocalSessionFactoryBean` is trying to use a hibernate version that is less than version 4. – LucasP May 21 '15 at 20:17
  • Well, I'll try to modify my ftl files so that they work with hibernate 4.3 and get back with the result. Thanks! – Boti May 21 '15 at 20:18
  • @LucasP, I moved the hibernate 3.. stuff into a different project, excluded the dependencies, but still getting the same thing. – Boti May 21 '15 at 21:41

1 Answers1

2

Use maven to find out which dependency brings you the wrong version of hibernate:

mvn dependency:tree -Dincludes=org.hibernate:hibernate-core:*:* -Dverbose=true -DoutputFile=<specify a file name>

http://maven.apache.org/plugins/maven-dependency-plugin/tree-mojo.html

ABalhier
  • 72
  • 2
  • 1
    Didn't help, everything seems fine. Thanks though! – Boti May 21 '15 at 21:42
  • The command helped me but the error still exists. java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/Session; – swamy Dec 18 '18 at 04:59