您的位置:首页 > 其它

hibernate初学者容易犯的错误

2007-08-28 17:23 211 查看
昨天,在厌倦了用别人配置好的环境开发后,终于尝试着开发了自己的第一个hibernate annotation程序,hibernate官方网(jboss.org)上有很好的tutorial,他们推荐的那本书籍《Java Persistence with hibernate》是《Hibernate in Action》的改进版,写得相当的不错,于是我照着书上的讲解开始了我的hibernate之旅。一切看似简单的东西在做的过程中才发现并不是那么简单,书上并没有帮你解决一切可能遇到的问题,我就在开发过程中遇到了诸多问题,而这些问题都是平时在编码过程中不注意细节造成的。废话不多说,下面介绍我遇到的一些白痴级错误:

1、
描述:
Exception in thread "main" org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): hello.Message

分析:
这个错误是我在定义entity时没有为主键指定GeneratedValue属性,这样hibernate就不会帮你生成主键,所以才会让你“手动给主键赋值”(ids for this class must be manually assigned)

解决:
在主键的get方法前加上@GeneratedValue语句即可

2、
描述:
Exception in thread "main" org.hibernate.TransactionException: Transaction not successfully started

分析:
这个错误的产生是因为我在保存entity后提交事务用的session.getTransaction().commit()语句,session.getTransaction()只是根据session获得一个Transaction实例,但是并没有启动它,所以它会告诉你“Transaction启动失败”(Transaction not successfully started)

解决:
应该用session.beginTransaction()代替session.getTransaction(),session.beginTransaction()方法在获得一个Transaction后调用其begin()方法,如果是请求创建一个新的“受控”Transaction,则启动这个Transaction,否则就直接使用已经存在的“受控”Transaction来完成工作。

3、
描述:
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial

分析:
这个异常在hibernate容器初始化时找不到JNDI服务提供商的默认属性和JNDI服务器没有被显式的配置时发生。

解决:
经过多次实验,发现用hibernate.properties代替hibernate.cfg.xml时就不会发生这个异常,因此确定问题一定出在cfg.xml文件上,可我的配置相当简单,根本没有关于JNDI的配置信息呀,怎么会跟它扯上关系了呢 ?问小哼(同事),他说没有遇到这样的问题,我靠,难道是我人品有问题,不管了,到网上狂搜一阵,无果,最后小哼说给我传一个他用的无错的cfg.xml,经过简单修改,居然没有出现这个异常了,我晕,对比了一下我们两的cfg.xml,几乎是一样的,除了数据库信息就是class文件映射了,但是怎么就我的有错呢?慢着,再仔细看看,终于找到一点不同的了,我的cfg.xml文件的<session-factory>一栏比他的多了个name属性,难道罪魁祸首就是它?于是用hibernate tools重新生成一个新的cfg.xml文件,没有让<session-factory>包含name属性,结果正常运行;然后我就将name属性加上,那个熟悉的异常信息又冒出来了。明白了,原来真的是它在捣鬼。于是查了下hibernate reference,原来name属性的作用是“以/jndi/name绑定到JNDI的SessionFactory实例”。我加了name属性,但是没有配置JNDI,因此才出现了这个错误。

通过发现错误并一一解决,我从hibernate门外汉变成了hibernate菜鸟,终于进了一步,哈哈,万事开头难,这最难的一步已经走了,剩下的事,还能拦得住我么?

温馨提示:
1、不要将hibernate.properties跟hibernate.cfg.xml混用,要么前者,要么后者,以免造成不必要的错误;

2、如果用hibernate.properties,创建SessionFactory时要用new AnnotationConfiguration().addAnnotatedClass(hello.Message.class).buildSessionFactory()这样的方式将POJO配置到hibernate中,否则将报“找不到xx class”异常;

3、如果用hibernate.cfg.xml,则需要用new AnnotationConfiguration().configure().buildSessionFactory()这样的方式创建SessionFactory,因为configure()方法就是起加载hibernate.cfg.xml的作用。

好了,文章就写到这里,我是hibernate菜鸟,请大侠们不要见笑~``

如果你们有好的学习方法,请不吝赐教,谢谢~```

Java咖啡群欢迎大家加入(加群者送分,顶帖者也送分哈),群号:60446231
本群以讨论IT行业话题为主,本着交流信息的原则,为大家营造一个轻松欢娱的环境,给平时枯燥的工作增添一些调味剂.
当然,技术问题同样在讨论范围之中.
本人在这里欢迎大家的到来,并预祝大家五一快乐.(鼓掌...谢谢...嘿嘿...)

Java基础群:49827836
为java初学者提供帮助,在讨论及解决问题中共同成长。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: