2013-02-24 5 views
5

Ich bin ganz neu in Spring Welt und ich werde verrückt versuchen, Hibernate in Spring-Anwendung zu integrieren mit HibernateTemplate abstrakte Unterstützung KlasseProbleme mit HibernateTemplate: java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession() Lorg/Ruhezustand/classic/Session;

ich die folgende Klasse haben auf Datenbanktabelle beharren:

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; 
} 
} 

Daneben habe ich eine Schnittstelle namens PersonDAO erstellt, in der ich nur meine CRUD-Methode definiere. So habe ich durch eine Klasse diese Schnittstelle implementieren namens PersonDAOImpl, die auch HibernateTemplate den Frühling abstrakte Klasse erweitern:

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 

} 

} 

(im Moment habe ich nur die addPerson() -Methode zu implementieren versuche)

Dann habe ich eine Hauptklasse erstellen, um die Operation des Einsatzes ein neues Objekt in die Datenbanktabelle zu testen:

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"); 
} 

} 

Wie Sie die PersonDAOImpl sehen Klasse erstreckt HibernateTemplate so denke ich, dass es den Betrieb der Einstellung der session enthalten muß ...

Das Problem ist, dass wenn ich versuche, diese MainApp Klasse zu laufen I erhalten die folgende Ausnahme:

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) 

Warum habe ich dieses Problem? Wie kann ich es lösen?

Um vollständig ich auch meine Abhängigkeiten Liste meiner pom.xml einfügen enthält:

<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' ist ziemlich alt und Hibernate 4.x unterstützt es nicht mehr. Benutze es nicht. – Lion

+0

ok, und was muss ich an seiner Stelle verwenden? – user2104160

+1

Sie sollten stattdessen 'org.hibernate.SessionFactory' verwenden (wenn Sie Hibernate verwenden), können Sie jedoch besser mit' EntityManager' umgehen. – Lion

Antwort

1

Seit HibernateTemplate wird in Hibern nicht mehr unterstützt aß 4.x und mein aktuelles Projekt ist gespickt mit der Verwendung von HibernateTemplate Ich habe mich entschieden, meine eigene benutzerdefinierte HibernateTemplate zu erstellen und zu verwenden.

Anstatt zu erweitern HibernateDaoSupport habe ich nur eine getHibernateTemplate() Methode zu meinem DAO hinzugefügt. In meiner benutzerdefinierten HibernateTemplate verwende ich dann die org.hibernate.SessionFactory, um die gleichen Operationen durchzuführen.

Verwandte Themen