- @Entity
- public class AbstractObject implements Serializable {
- private static final long serialVersionUID = -6555909688667081217L;
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- protected Integer id;
- @Column
- protected String name;
- @OneToMany(cascade = { CascadeType.ALL }, mappedBy = "obj")
- private List<RelatedObj> relatedObjs;
- …
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的作用。
文章出处:DIY部落(http://www.diybl.com/course/3_program/java/javajs/200797/70047.html)