java.lang.NoSuchMethodError:org.hibernate.SessionFactory.getCurrentSession()Lorg / hibernate / classic / Session;

时间:2013-01-16 10:17:14

标签: java hibernate

这是我的配置。

它说没有找到这样的方法,但在Java文档和我的Util文件中都存在。我在某处读到了它与hibernate 3和4的交叉配置。不能得到这个......

 <!DOCTYPE hibernate-configuration SYSTEM
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
        <hibernate-configuration>
            <session-factory>   


                <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
                <property name="connection.url">jdbc:mysql://localhost/datacenter</property>
                <property name="connection.username">root</property>
                <property name="connection.password">admin</property>  


                <property name="dialect">org.hibernate.dialect.MySQLDialect</property>      
                <property name="current_session_context_class">thread</property>
                <property name="show_MySql">TRUE</property>
                <property name="format_sql">TRUE</property>
                <property name="jboss.as.jpa.providerModule">hibernate3-bundled</property>


                <property name="hibernate.hbm2ddl.auto">update</property>
                <property name="hibernate.cache.use_second_level_cache">true</property>
               <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property> 

                <!-- List of annotated classes-->
                <!-- Associations -->
                <!-- One to one -->
                <mapping class="Emp_Timecard" />
                <mapping class="maindoor" />
                <mapping class="serverroom" />
                <mapping class="timesheet" />
                <mapping class="hibernatepojos.Resource_list"/>


            </session-factory>
        </hibernate-configuration>

这是我的Util文件:

package hibernatedata;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {

    private static SessionFactory sessionFactory;
    private static AnnotationConfiguration config1;

    static {
        config1 = (AnnotationConfiguration) new AnnotationConfiguration()
                .configure("hibernate.cfg.xml");

    }

    public static SessionFactory getSessionFactory() {
        if (sessionFactory == null) {

            createSessionfactory();
        } 
        return sessionFactory;

    }

    private static void createSessionfactory() {
        sessionFactory = config1.buildSessionFactory();

    }

    public static Session openSession() {

        return getSessionFactory().getCurrentSession();
    }

    public static void closeSessionFactory() {

        // getSessionFactory().close();
    }

    public static void save(Object o) {
        Session s = openSession();
        System.out.println("kejrkvg");
        s.beginTransaction();
        s.save(o);
        s.getTransaction().commit();
        // s.close();
        // s.clear();
        if (s.isOpen()) {

            s.close();
        }
        closeSessionFactory();
    }

    public static void delete(Object o) {
        Session s = openSession();
        s.beginTransaction();
        s.delete(o);
        s.getTransaction().commit();
        // s.close();
    }

    public static <T> T load(Class<T> clazz, int id) {
        Session s = openSession();
        s.beginTransaction();
        T t = clazz.cast(s.load(clazz, id));
        // s.getTransaction().commit();

        return t;

    }

    public static void update1(Object o) {
        Session s = openSession();
        s.beginTransaction();
        s.update(o);
        s.getTransaction().commit();
        // s.close();
    }

}

2 个答案:

答案 0 :(得分:1)

  

它说没有找到这样的方法,但是在Java文档中做得很好

错误是在运行时生成的,而不是在编译代码时生成的。所以看起来你的一些代码是针对一个版本的代码编译的,但是会再次执行一个不同的,可能是旧的版本。完整堆栈跟踪将包含有关不兼容性所在位置的更多信息。

如果有疑问,可以使用javap来查看从给定系统上的给定类路径加载的类是否实际包含该方法。如果您希望使用的类路径不提供该方法,则可能需要在该路径中安装正确版本的库。另一方面,如果它看起来也是正确的,那么这是一个很好的迹象,表明一个不同的类被加载而不是你期望的那个。然后,您可以添加调试代码以确定用于加载该类的类加载器,以查看它实际来自何处。

答案 1 :(得分:0)

问题java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session的已接受答案也可能提供一些见解 - &#34;在Hibernate 3.6中,SessionFactory.openSession不再返回org.hibernate.classic.Session,而是返回一个org.hibernate.Session。这是一个破坏客户端代码的重构器。&#34;