2013-02-24 31 views
5

Sono abbastanza nuovo nel mondo primavera e sto impazzendo cercando di integrare Hibernate in applicazione primavera utilizzando HibernateTemplate classe astratta supportoProblemi nell'utilizzo di HibernateTemplate: java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession() Lorg/hibernate/classic/Session;

Ho il seguente classe di persistere sulla tabella di database:

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

Accanto ad esso ho creato un'interfaccia denominata PersonDAO in cui definisco solo il mio metodo CRUD. Così ho implementare questa interfaccia da una classe denominata PersonDAOImpl che si estendono anche la classe astratta primavera 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 

} 

} 

(in questo momento sto cercando di implementare solo l'addPerson() metodo)

poi ho creare una classe principale di testare il funzionamento di inserire un nuovo oggetto nella tabella del database:

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

} 

Come si può vedere le PersonDAOImpl classe estende HibernateTemplate quindi penso che deve contenere il funzionamento della regolazione del sessionFactory ...

Il problema è che quando provo a fare funzionare questa classe MainApp ottengo la seguente eccezione:

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) 

Perché ho questo problema? Come posso risolverlo?

essere completo anche io inserisco il mio pom.xml contenente la mia lista delle dipendenze:

<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' è piuttosto vecchio e Hibernate 4.x non lo supporta più. Non usarlo – Lion

+0

ok, e cosa devo usare al suo posto? – user2104160

+1

Si dovrebbe usare 'org.hibernate.SessionFactory' invece (se si sta usando Hibernate), si potrebbe trattare meglio con' EntityManager'. – Lion

risposta

1

Poiché HibernateTemplate non è più supportato in Hibern ho mangiato 4.x e il mio progetto attuale è crivellato con l'uso di HibernateTemplate Ho deciso di creare e utilizzare la mia personalizzata HibernateTemplate.

Invece di estendere HibernateDaoSupport ho appena aggiunto un metodo getHibernateTemplate() al mio DAO. Nella mia personalizzata HibernateTemplate, quindi, utilizzo lo org.hibernate.SessionFactory per eseguire le stesse operazioni.

Problemi correlati