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初学者提供帮助,在讨论及解决问题中共同成长。
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初学者提供帮助,在讨论及解决问题中共同成长。
相关文章推荐
- Hibernate Dialect must be explicitly set的异常(初学者较容易犯的错误)
- JPA的定义 以及hibernate初学者容易犯的错误
- Hibernate Dialect must be explicitly set的异常(初学者较容易犯的错误)
- 总结Unity 初学者容易犯的编译与运行时错误(第二部分)
- git初学者容易出现的错误
- 总结Unity 初学者容易犯的编译与运行时错误
- Hibernate3.6 容易报的两处错误
- PICC使用中初学者容易犯得两个错误
- .NET编程初学者容易犯的错误和容易混淆的概念
- java初学者容易犯的错误
- 总结Unity 初学者容易犯的编译与运行时错误
- 总结Unity 初学者容易犯的编译与运行时错误
- 配置Hibernate容易产生的错误
- Hibernate初学者错误总结
- 初学者比较容易犯的布局错误(手风琴布局)
- java深入浅出设计模式----简单的工厂模式(一)----初学者容易犯的错误(二)
- 项目中用hibernate容易出现错误的几个地方小记一下
- Python 初学者容易犯的错误
- 使用c/c++指针 初学者容易犯的几个错误
- Hibernate3.6 容易报的两处错误