2013-02-24 2 views
5

Я совершенно новый весной мире, и я схожу с ума, пытаясь интегрировать Hibernate в Spring приложения с помощью HibernateTemplate абстрактный класс поддержкиПроблемы с использованием HibernateTemplate: java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession() Lorg/hibernate/classic/Session;

У меня есть следующий класс упорствовать в таблице БД:

package org.andrea.myexample.HibernateOnSpring.entity; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name="person") 
public class Person { 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private int pid; 

private String firstname; 

private String lastname; 

public int getPid() { 
    return pid; 
} 

public void setPid(int pid) { 
    this.pid = pid; 
} 

public String getFirstname() { 
    return firstname; 
} 

public void setFirstname(String firstname) { 
    this.firstname = firstname; 
} 

public String getLastname() { 
    return lastname; 
} 

public void setLastname(String lastname) { 
    this.lastname = lastname; 
} 
} 

Рядом с ним я создал интерфейс с именем PersonDAO, в котором я определяю только мой метод CRUD. Так что я реализовать этот интерфейс классом по имени PersonDAOImpl, который также продлить весенний абстрактный класс HibernateTemplate:

package org.andrea.myexample.HibernateOnSpring.dao; 

import java.util.List; 

import org.andrea.myexample.HibernateOnSpring.entity.Person; 
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 

public class PersonDAOImpl extends HibernateDaoSupport implements PersonDAO{ 


public void addPerson(Person p) { 
    getHibernateTemplate().saveOrUpdate(p); 

} 

public Person getById(int id) { 
    // TODO Auto-generated method stub 
    return null; 
} 

public List<Person> getPersonsList() { 
    // TODO Auto-generated method stub 
    return null; 
} 

public void delete(int id) { 
    // TODO Auto-generated method stub 

} 

public void update(Person person) { 
    // TODO Auto-generated method stub 

} 

} 

(на данный момент я пытаюсь реализовать только addPerson() метод)

Тогда я создать основной класс для проверки работы вставки нового объекта в базе данных таблицы:

package org.andrea.myexample.HibernateOnSpring; 

import org.andrea.myexample.HibernateOnSpring.dao.PersonDAO; 
import org.andrea.myexample.HibernateOnSpring.entity.Person; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class MainApp { 

public static void main(String[] args) { 

    ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); 
    System.out.println("Contesto recuperato: " + context); 

    Person persona1 = new Person(); 

    persona1.setFirstname("Pippo"); 
    persona1.setLastname("Blabla"); 

    System.out.println("Creato persona1: " + persona1); 

    PersonDAO dao = (PersonDAO) context.getBean("personDAOImpl"); 

    System.out.println("Creato dao object: " + dao); 

    dao.addPerson(persona1); 

    System.out.println("persona1 salvata nel database"); 
} 

} 

Как вы можете видеть PersonDAOImpl класс расширяет HibernateTemplate, так что я думаю, что он должен содержать операцию установки в SessionFactory ...

Проблема заключается в том, что, когда я пытаюсь запустить этот MainApp класс я получить следующее:

Exception in thread "main" java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session; 
    at org.springframework.orm.hibernate3.SessionFactoryUtils.doGetSession(SessionFactoryUtils.java:323) 
    at org.springframework.orm.hibernate3.SessionFactoryUtils.getSession(SessionFactoryUtils.java:235) 
    at org.springframework.orm.hibernate3.HibernateTemplate.getSession(HibernateTemplate.java:457) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:392) 
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 
    at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:737) 
    at org.andrea.myexample.HibernateOnSpring.dao.PersonDAOImpl.addPerson(PersonDAOImpl.java:12) 
    at org.andrea.myexample.HibernateOnSpring.MainApp.main(MainApp.java:26) 

Почему у меня есть эта проблема? как я могу это решить?

Для полноты я вставляю 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>org.andrea.myexample</groupId> 
<artifactId>HibernateOnSpring</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>jar</packaging> 

<name>HibernateOnSpring</name> 
<url>http://maven.apache.org</url> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 

    <!-- Dipendenze di Spring Framework --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>3.2.1.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-beans</artifactId> 
     <version>3.2.1.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>3.2.1.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context-support</artifactId> 
     <version>3.2.1.RELEASE</version> 
    </dependency> 


    <dependency> <!-- Usata da Hibernate 4 per LocalSessionFactoryBean --> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>3.2.0.RELEASE</version> 
    </dependency> 

    <!-- Dipendenze per AOP --> 
    <dependency> 
     <groupId>cglib</groupId> 
     <artifactId>cglib</artifactId> 
     <version>2.2.2</version> 
    </dependency> 

    <!-- Dipendenze per Persistence Managment --> 

    <dependency> <!-- Apache BasicDataSource --> 
     <groupId>commons-dbcp</groupId> 
     <artifactId>commons-dbcp</artifactId> 
     <version>1.4</version> 
    </dependency> 

    <dependency> <!-- MySQL database driver --> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.23</version> 
    </dependency> 

    <dependency> <!-- Hibernate --> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.1.9.Final</version> 
    </dependency> 



</dependencies> 
</project> 
+1

'HibernateTemplate' довольно старый, а Hibernate 4.x больше не поддерживает его. Не используйте его. – Lion

+0

ОК, и что я должен использовать на своем месте? – user2104160

+1

Вместо этого вы должны использовать 'org.hibernate.SessionFactory' (если вы используете Hibernate), вы можете лучше справиться с' EntityManager'. – Lion

ответ

4

Вы должны использовать поддержку Пружины Hibernate4

import org.springframework.orm.hibernate4.support.HibernateDaoSupport; 

Подробнее здесь: http://blog.springsource.org/2012/04/06/migrating-to-spring-3-1-and-hibernate-4-1/

+3

Не существует 'hibernate4.support.HiberbateDaoSupport' –

+0

HiberbateDaoSupport, устаревший с версии 3 и версии 4, удаляется – Pinchy

1

С HibernateTemplate больше не поддерживается в Хиберне ate 4.x, и мой текущий проект пронизан использованием HibernateTemplate. Я решил создать и использовать свой собственный код HibernateTemplate.

Вместо того, чтобы расширять HibernateDaoSupport Я только что добавил метод getHibernateTemplate() к моему DAO. В моем обычном HibernateTemplate я затем использую org.hibernate.SessionFactory для выполнения тех же операций.