要解释hibernate的错误,就必须完全了解hibernate的执行流程,和他需要的一些信息(主要就是一些配置文件)
在hibernate内部,不知道Person是一个持久化类
错误之一:在hibernate.cfg.xml文件中,没有把person的映射文件加进去
错误原因:
表不存在
根据持久化类和映射文件没有建立表
在hibernate.cfg.xml中,得配<propertyname="hbm2ddl.auto">update</property>才能让hibernate帮你创建表
session.get方法调用的是该对象默认的构造函数创建对象的,所以所以一个持久化类中必须得保证有一个默认的构造函数
这是由于hibernate是是根据OID来区别两个对象的,必须保证不同的对象的OID不一样。
在hibernate的配置文件中,映射文件的路径或者名称写错了
错误原因:因为在映射文件中才要查找持久化类,所以如果持久化类找不到,肯定是映射文件的问题在映射文件中class元素的name属性的值写错了
hibernate中的session.get方法的第二个参数的类型应该和相应的持久化类的标识符类型相匹配
这可能就是由于该字段不支持自动增长,需要设置自动增长
错误原因:在映射文件中,该对象的主键的生成机制是assigned,但是在程序中却没有赋值
错误分析:
通过映射文件可以知道:classes与student是一对多的关系通过该代码可以看出在保存classes的时候要保存student
显示保存:只要session.save操作了一个对象,就是显示保存
隐式保存:不在程序中做保存的动作,而交给hibernate来做
只有在classes.hbm.xml文件中
<set name="students"cascade="save-update">存在cascade属性 hibernate才要做隐式操作
如果没有写cascade属性,在保存classes的时候,student仍然是临时状态。在两个对象关联的时候,进行保存的时候,hibernate不允许有临时状态的对象的出现
错误原因:映射文件和持久化类中的属性不匹配
错误原因:没有找到关联的类Classes.hbm.xml文件中关联student,所以在这里没有在classes.hbm.xml文件中找到student
错误的根本原因:就是主外键的约束 外键(jdbc)--->inverse(hibernate)
产生对象利用的是懒加载的模式,但是并没有把实际的内容加载出来,而这个时候session关闭了