使用 HibernateTemplate 的问题:java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15050453/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Problems using HibernateTemplate: java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;
提问by user2104160
I am quite new in Spring world and I am going crazy trying to integrate Hibernate in Spring application using HibernateTemplateabstract support class
我在 Spring 世界中很新,尝试使用HibernateTemplate抽象支持类将 Hibernate 集成到 Spring 应用程序中,我快疯了
I have the following class to persist on database table:
我有以下类可以保留在数据库表上:
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;
}
}
Next to it I have create an interface named PersonDAOin wich I only define my CRUD method. So I have implement this interface by a class named PersonDAOImplthat also extend the Spring abstract class HibernateTemplate:
在它旁边我创建了一个名为PersonDAO的接口,我只定义了我的 CRUD 方法。所以我通过一个名为PersonDAOImpl的类实现了这个接口,该类也扩展了 Spring 抽象类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
}
}
(at the moment I am trying to implement only the addPerson() method)
(目前我只想实现 addPerson() 方法)
Then I have create a main class to test the operation of insert a new object into the database table:
然后我创建了一个主类来测试将新对象插入数据库表的操作:
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");
}
}
As you can see the PersonDAOImplclass extends HibernateTemplateso I think that it have to contain the operation of setting of the sessionFactory...
正如你所看到的PersonDAOImpl类扩展了 HibernateTemplate所以我认为它必须包含 sessionFactory 的设置操作......
The problem is that when I try to run this MainApp class I obtain the following exception:
问题是,当我尝试运行此 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)
Why I have this problem? how can I solve it?
为什么我有这个问题?我该如何解决?
To be complete I also insert my pom.xmlcontaining my dependencies list:
为了完整起见,我还插入了包含我的依赖项列表的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>
回答by user1329931
You should be using Springs Hibernate4 support
您应该使用 Springs Hibernate4 支持
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
More details here: http://blog.springsource.org/2012/04/06/migrating-to-spring-3-1-and-hibernate-4-1/
更多细节在这里:http: //blog.springsource.org/2012/04/06/migrating-to-spring-3-1-and-hibernate-4-1/
回答by Gibado
Since HibernateTemplate
is no longer supported in Hibernate 4.x and my current project is riddled with the use of HibernateTemplate
I've opted to create and use my own custom HibernateTemplate
.
由于HibernateTemplate
Hibernate 4.x 不再支持并且我当前的项目充斥着使用HibernateTemplate
我选择创建和使用我自己的自定义HibernateTemplate
.
Rather than extending HibernateDaoSupport
I just added a getHibernateTemplate()
method to my DAO. In my custom HibernateTemplate
I then use the org.hibernate.SessionFactory
to perform the same operations.
而不是扩展HibernateDaoSupport
我只是getHibernateTemplate()
在我的 DAO 中添加了一个方法。在我的自定义中,HibernateTemplate
我然后使用org.hibernate.SessionFactory
来执行相同的操作。