7

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

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

2013 年 2 月 11 日下午 5:21:04 org.hibernate.cfg.Configuration doConfigure 信息:已配置 SessionFactory:空

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

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

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

资源,我一直在看

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

网豆
(来源:iforce.co.nz

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>

主要的

public class Prime {

    private long prime;

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

    public long getPrime(){
        return this.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>

素数表

CREATE TABLE prime_table (
    [prime] bigint PRIMARY KEY NOT NULL,
)

会话功能或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();
        }
    }

}

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

更新:休眠本身,运行良好。但是与 Spring 结合使用时,会发生这些错误。(更多信息在评论中)。

4

2 回答 2

5

看起来您缺少 Hibernate 在运行时需要的库。我在代码(MySQL 5、MySQL JDBC 驱动程序、Mac OS)中看到了与您相同的行为,直到我更改了行:

catch (Exception e) {
      System.out.println(e.getMessage());
}

到:

catch (Throwable e) {
       e.printStackTrace();
}

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

既然可以捕获 Throwables,为什么还要在 Java 中捕获异常?

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

<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>

更新,根据评论回答:

我不使用 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(一个字节码操作库)的高级包装器。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

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

于 2013-02-12T09:15:24.917 回答
-1

它在 session.flush() 处死去;因为 session 是 null 并且 try-block 中的某些东西正在抛出异常,可能是运行时异常,如 nullpointer 或其他东西。会话为 null 的事实将导致另一个 nullptr 并且它将隐藏原始的。所以我建议你做

if(session!=null)
{
    session.flush();
    session.close();
}

然后运行它以查看实际问题是什么。

我还建议您替换“System.out.println(e.getMessage());” 至少有 e.printStackTrace(); 或者最好是适当的日志记录。

于 2013-02-12T07:33:37.940 回答