JPA的定义 以及hibernate初学者容易犯的错误

  1. @Entity  
  2. public class AbstractObject implements Serializable {   
  3.     private static final long serialVersionUID = -6555909688667081217L;   
  4.        
  5.     @Id    
  6.     @GeneratedValue(strategy = GenerationType.AUTO)   
  7.     protected Integer id;   
  8.     @Column  
  9.     protected String name;   
  10.     @OneToMany(cascade = { CascadeType.ALL }, mappedBy = "obj")   
  11.     private List<RelatedObj> relatedObjs;   
  12. …  

 

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值