MyEclipse 6.5 + Hibernate 3.1.2 + PL/SQL Developer 8.0 + Oracle9i

hibernate实例总结:

 

最近呢几天在学习hibernate,做第一个实例的时候就遇到一些问题,在网上查了很耐都无解决方案。一是可能网上的答案太简单了,自己学得还比较浅,不容易理解,所以看不懂。一是其他人都忽略了初学者会遇到的问题。

现在总结如下:(前面几个步骤只大概说一下,因为网上或一些书本都有详细的步骤)

1、用PL/SQL Developer新建一个数据库表。
2、构建用户库,将hibernate3.1.2解压后根目录下的hibernate3.jar和lib目录下的全部jar文件导入。
3、构建用户库,数据库连接驱动包/oracle/ora92/jdbc/lib下的ojdbc4.jar文件。
4、build path(构建路径)下JRE库使用JRE_LIB变量。
5、创建项目,建立类,设置变量对应数据库表字段,可自动生成get、set方法。
6、在包下创建映射文件,要注意和数据库字段的关系,如果和字段名不一致,要用column设置映射关系。
7、在src目录下创建配置文件hibernat.cfg.xml(关键是这里,这个文件名是固定的吧),在Hibernate

Configuration图形界面下一步一步设置各个选项(本人测试要先在源代码窗口输入下面的信息后,才可

以在这里的图形界面操作)。DB Driver--->New--->(填完信息)Finish。
<!DOCTYPE hibernate-configuration PUBLIC
 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

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

最后,mapping那里,如果*.hbm.xml文件中类变量和数据库字段名没有映射好,在界面上就加入不了,就算用手工敲好了代码,编译的时候还是会报*.hbm.xml文件有错。

 

 

 

 

8、编写测试类。

注:测试过程中,*.hbm.xml文件中的属性(即步骤5中创建的变量名)要与数据库中的字段一致,否则会

报*.hbm.xml文件有错。或者设置好映射关系(这种写法暂未测试)。

测试过程中,数据库初始字段值分别为a/b/c/d,类中变量分别定义为x/y/z/k,在建立

hibernate.cfg.xml文件时,在界面怎么也添加不了*.hbm.xml文件。后来删除数据库,重建数据库使字段

值分别为x/y/z/k后,问题立即解决。编译正确,成功插入数据库。(后知道原因是在*.hbm.xml文件中没映射好数据库字段。)

 

 

下面说一下在练习过程中遇到的一些问题:

1.

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" java.lang.NullPointerException
 at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:169)
 at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2833)
 at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2829)
 at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1840)
 at hibernate.TestUser.main(TestUser.java:12)

 

这是由于hibernate版本的问题,这里我一开始是用了hibernate3.6版本。原因是3.6版本自带的slf4j-api-1.6.1.jar加载有问题,重新下两个文件:slf4j-api-1.5.6.jar、slf4j-nop-1.5.2.jar可以解决slf4j的问题。但后面的问题仍存在,不知是哪里的问题了。

 

这里换为hibernate3.0版本就没有问题,和3.1版本一样可以正确将数据插入数据库。

 

2.

org.hibernate.HibernateException: /hibernate.cfg.xml not found
at org.hibernate.util.ConfigHelper.getResourceAsStream(ConfigHelper.java:170)
at org.hibernate.cfg.Configuration.getConfigurationInputStream(Configuration.java:2146)
at org.hibernate.cfg.Configuration.configure(Configuration.java:2127)
at org.hibernate.cfg.Configuration.configure(Configuration.java:2107)
at hibernate.TestUser.main(TestUser.java:14)

这个错误是hibernate.cfg.xml放错目录了,一开始放在包目录下,后来改放在src目录下就好了。

 

3.

org.hibernate.HibernateException: Could not parse configuration: /hibernate.cfg.xml
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1376)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1310)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1296)
at hibernate.TestUser.main(TestUser.java:15)
Caused by: org.dom4j.DocumentException: http://www.jboss.org/dtd/hibernate/hibernate-Configuration-3.0.dtd Nested exception: http://www.jboss.org/dtd/hibernate/hibernate-Configuration-3.0.dtd
at org.dom4j.io.SAXReader.read(SAXReader.java:484)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1366)
... 3 more


这个问题终于试出来了,原来是一个字母的大小写问题:
<!DOCTYPE hibernate-configuration PUBLIC  
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-Configuration-3.0.dtd">
首字母没留意写到大写了,改为小写就ok了。
还有映射资源mapping部分是包名/类名就ok了,所以这里
<mapping resource="Welcome2Hibernate/src/hibernate/User.hbm.xml"/>
改为
<mapping resource="hibernate/User.hbm.xml"/>
若包名含有.符号,举例如下:
包名ch03.hibernate,则mapping部分为:
<mapping resource="ch03/hibernate/User.hbm.xml"/>

 

4.

org.hibernate.exception.ConstraintViolationException: could not insert: [hibernate.User]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:69)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:1986)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2405)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:37)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:269)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:167)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:559)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:547)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:543)
at hibernate.TestUser.main(TestUser.java:18)
Caused by: java.sql.SQLException: ORA-01400: 无法将 NULL 插入 ("DRAGON"."MYUSERTABLE"."ID")

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093)
at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047)
at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2709)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:1976)
... 15 more

这个错误是下面这个class属性值造成的:
user.hbm.xml文件中,由于数据库第一个字段是理解为自增的,在例子中
<id name="id" column="ID">
<generator class="identity"/>
</id>
主键生成器使用了identity属性,而在后面的测试代码中也没有编写user.setid(1)的代码,一开始就以为identity属性就是可以自增的。后来才发现并非如此,如使用identity属性,在测试代码中还是要把变量id给赋值。

用下面的这个属性才是自增的:
<id name="id" column="ID">
<generator class="increment"/>
</id>

这里参考了:http://marshzg.javaeye.com/blog/613073

 

5.

Exception in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
 at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:65)
 at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
 at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:202)
 at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:230)
 at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
 at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
 at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
 at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1009)
 at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:356)
 at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
 at hibernatet.tableTest.main(tableTest.java:20)
Caused by: java.sql.BatchUpdateException: ORA-00904: "X": 无效的标识符

 at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:458)
 at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:3907)
 at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
 at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
 ... 8 more

 

这个错误是由于类变量与数据库表字段没有映射,要在*.hbm.xml文件中用column属性设置好映射关系。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值