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一起,会发生这些错误.(评论中的更多信息).
看起来你错过了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中的库的一整套NoClassDefFoundError和ClassNotFoundError消息.我怀疑你错过了一个Hibernate需要的库,并且因为你正在捕捉Exception而不是Throwable- 捕获Error- 你没有看到错误消息.看到:
如果你抓住了,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
祝你好运,这一直是一个有趣的问题!
| 归档时间: |
|
| 查看次数: |
782 次 |
| 最近记录: |