预先配置的netbeans项目与NoSuchMethodError hibernate和spring冲突

Kil*_*awr 7 java spring netbeans hibernate jdbc

所以我试图让我的Java应用程序通过用于SQL Server的 Microsoft JDBC驱动程序4.0连接到SQL Server 2012 ,并且一切似乎进展顺利但是hibernate只是不断回来NullExceptions并且不会执行任何内容try/catch(因此的NullException),我完全不知道为什么.这是来自运行hibernate的netbeans console()的pastebine.getMessage()(出于这个问题的目的,我正在使用一个名为的示例表prime_table).

在pastebin日志中,你会注意到......

2013年2月11日下午5:21:04 org.hibernate.cfg.Configuration doConfigure INFO:已配置的SessionFactory:null

关于为什么会发生这种情况的任何想法?(我不确定,但它可能与整体堆栈跟踪有关).

其他日志(在JSP构建期间)

所有日志将在2013年3月中旬或3月下旬之前提供

资源,我一直在读

预配置的Netbeans项目设置 commandline: tree /f

netbeans http://iforce.co.nz/i/llroxgez.s5s.png

Hibernate.cfg.xml(Hari"hibernate.cache.provider_class"建议添加)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
    <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
    <property name="hibernate.connection.url">jdbc:sqlserver://Michael-PC:1433;databaseName=PrimeDB</property>
    <property name="hibernate.connection.username">sa</property>
    <property name="hibernate.connection.password">online12</property>
    <property name="hibernate.connection.pool_size">10</property>
    <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <!-- Data Mappings -->
    <mapping resource="prime.hbm.xml"/>
  </session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)

主要

public class Prime {

    private long prime;

    public void setPrime(long nPrime){
        this.prime = nPrime;
    }

    public long getPrime(){
        return this.prime;
    }

}
Run Code Online (Sandbox Code Playgroud)

prime.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="nz.co.xyleap.db.Prime" table="prime_table">
    <id name="prime" type="long" column="prime" />
  </class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

Prime Table

CREATE TABLE prime_table (
    [prime] bigint PRIMARY KEY NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)

会话功能或 FirstExample.java

public class FirstExample {

    public static void main(String[] args) {
        FirstExample ex = new FirstExample();
        ex.session();
    }

    public void session() {
        Session session = null;
        try {
            // This step will read hibernate.cfg.xml and prepare hibernate for use
            SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
            session = sessionFactory.openSession();
            session.beginTransaction();
            //Create new instance of Contact and set values in it by reading them from form object
            System.out.println("inserting record 13");
            Prime p = new Prime();
            p.setPrime(13);
            session.save(p);
            System.out.println("Done");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            // Actual contact insertion will happen at this step
            session.flush();
            session.close();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

据我所知,一切都应该是正确的,我应该能够将Java Hibernate中的记录插入到我的SQL数据库中.但出于某种原因,我不能: - /

更新:Hibernate本身运行良好.但是与Spring一起,会发生这些错误.(评论中的更多信息).

Har*_*ari 5

看起来你错过了Hibernate在运行时需要的库.在我更改行之前,我看到了与您的代码(MySQL 5,MySQL JDBC驱动程序,Mac OS)相同的行为:

catch (Exception e) {
      System.out.println(e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)

至:

catch (Throwable e) {
       e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

然后我开始看到有关Hibernate正在寻找但未包含在我的CLASSPATH中的库的一整套NoClassDefFoundErrorClassNotFoundError消息.我怀疑你错过了一个Hibernate需要的库,并且因为你正在捕捉Exception而不是Throwable- 捕获Error- 你没有看到错误消息.看到:

为什么捕获Throwables时会捕获Java中的异常?

如果你抓住了,Throwable你会很快看到你缺少的库和类:我的猜测是你可能缺少EHCache(Hibernate似乎默认使用它作为二级缓存),CGLIB/ASM,或Java Transaction API.如果您缺少EHCache并希望hibernate使用自己的内存中Hashtable缓存而不是EHCache,请将以下行添加到hibernate.cfg.xml:

<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
Run Code Online (Sandbox Code Playgroud)

更新,根据评论回答:

我不使用NetBeans,所以我没有遇到这个问题,但它似乎相当普遍.看到:

错误:java.lang.NoSuchMethodError:org.objectweb.asm.ClassWriter.<init>(I)V

http://www.hildeberto.com/2008/05/hibernate-and-jersey-conflict-on.html(报告Netbeans中Hibernate和Jersey的类似问题)

https://hibernate.onjira.com/browse/HHH-2222(提到此问题的Hibernate错误报告)

http://netbeans.org/bugzilla/show_bug.cgi?id=145589(使用旧版本的cglib捆绑Hibernate的Netbeans错误报告).

链接到上面的StackOverflow帖子有很多细节.总结一下:

  • Hibernate 3.2使用CGLib 2.1.3进行运行时代码生成,以提高性能并生成一对一和一对多映射的代理.

  • CGLib是ASM的高级包装器,ASM是一个字节码操作库.CGLib 2.1.3需要ASM 1.5.3,它与ASM 2.2 二进制不兼容.反过来,ASM 2.2是Spring版本<2.5的依赖项.

  • 为了解决Hibernate和Spring之间的这些问题,Spring 2.5将自己的asm版本与spring包名称捆绑在一起; 更高版本的Hibernate使用CGLIB 2.2,它还将自己的ASM版本与自定义包名称捆绑在一起.最新版本的Hibernate完全取消了CGLIB并改为使用Javassist,但NetBeans仍然捆绑了Hibernate 3.2.5.

你有几个选择,然后:

  • 使用CGLIB 2.2更新Netbeans中的Hibernate库包

  • 告诉Hibernate使用Javassist进行运行时代码生成.将此行添加到hibernate.properties,或使用-D将其指定为系统属性(显然,您无法在hibernate.cfg.xml中指定此属性):

    hibernate.bytecode.provider=javassist

祝你好运,这一直是一个有趣的问题!