Hibernate概念及常见错误解决方案

----------------hibernate概念开始----------------

Hibernate简单讲就是ORM,对象关系映射的一种技术,直接将POJO对象跟DB间的关系进行配置,描述。目标是为了解决OO开发人员将对象映射成为RDB中实体的过程,屏蔽其中的差异性。

POJO状态说明:
在利用hibernate API 操作数据库时,POJO的三种状态:
瞬时状态:当POJO.new()时的状态;POJO进行了delete操作,此时的POJO已经不在DB中,也称为瞬时状态。(可以理解为没进行持久化操作的时候)
持久化状态:在利用hibernate session对象进行【增改查】的时候处于的状态
游离状态:session关闭后
POJO中【主键】属性应该尽可能的定义为包装类型,虽然很多人认为基本类型数据不需要进行对象的封箱和解箱操作,但是在hibernate中,主键是被转化成对象进行操作的。假设在设计POJO的时候我们将主键设置为基本数据类型,那么hibernate在接受后,需要转换,当用户要换取时,又要进行数据转换,这样可能会导致效率更低。所以建议大家使用包装类数据。

这里需要注意unsaved-value是个很重要的属性。Hibernate通过这个属性来判断一个对象应该save还是update,如果这个对象的id是unsaved-value的话,那说明这个对象不是 persistence object会进行save(insert)操作;如果id是非unsaved-value的话,那说明这个对象是persistence object(数据库中已存在),只要update就行了。

缓存的概念:
一级缓存又称为session级缓存,随session开启和关闭。
二级缓存又称为sessionfactory级缓存,需要通过配置文件和第三方jar开启和使用。
清楚缓存中的数据或对象使用.evict(object);

----------------hibernate概念结束----------------
----------------hibernate使用步骤开始----------------
这个内容比较简单:
1、确定POJO(规范:符合JAVABEAN规范;必须有个唯一标示指向DB中的唯一记录,通常是o_id;集合类型属性,必须用接口类型代替,因为hibernate中使用的是apache.commons.collections,集合框架增强包)
2、配置hibernate.cfg.xml和pojo.hbm.xml
3、使用hibernate API进行操作。
----------------hibernate使用步骤结束----------------
----------------hibernate 对象关系映射要点开始----------------

在设置关系中遇到<?-to-?>时:
注意配置它所指向的对象的class;
它是在描述对方的一些信息;

关于inverse和cascade:
cascade是级联操作,标示该属性要根据对方的主键才能操作,有这个属性时,操作此时会跳到对方去先执行(因为是作为外表主键的关系)。
inverse表示一种【关系】的维护,并且由定义了inverse为false的属性进行维护。值为true时,表示【我】不维护。如果双方都为true,那么中间的关系(特别是在多对多中体现非常明显,中间表又称关系表中,不会有任何关系数据)就完全无法体现。所以通常有一方为false。

常见标签及属性解释:
<id >下的<generator>博客中有详细解释。

<property name="" column="" type="">
用于描述对象属性:name属性名称;column对应到表中的字段;类型(提高性能必写)

<set name="" table="" cascade="" inverse="">
<key column=""></key>
<?-to-? class="" column="">
</many-to-many>
</set>
这是一个set集合属性:tabel指这个集合关系映射的表,<key>中描述了当前对象的id对应tabel中所指向表中的字段。
----------------hibernate 对象关系映射要点结束----------------

----------------hibernate API的相关知识以及性能优化开始----------------
一、数据查询:
两者都是查询数据集的方法:
session.list();
session.iterator();
区别:
1、执行sql的次数:
前者查询后返回一个List类型的数据集合,加上对这个集合的数据进行遍历,整个查询过程也只需要一条sql语句;后者返回一个Iterator类型的数据集合时已经执行了一条sql语句,在迭代的过程中,每获取一个对象,再追加一条sql语句,总共执行返回的记录条数+1条sql语句。
2、缓存机制:
前者在数据查询时,首先会到一级缓存查找,如果没有查找到记录,直接到DB中进行后续操作。
后者查找顺序是一级缓存中查找,没有找到记录,查找二级缓存,再到DB中。

【使用心得】网上找了许多,高手通常是在第一次查找数据时使用list,然后将结果集置入二级缓存中,再次查询时使用iterator,以此来优化持久化数据操作的性能。

----------------hibernate API的相关知识以及性能优化结束----------------

以下是对hibernate中常见的错误进行的总结:

------
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
------

引发这种问题的关键是:POJO中的id值与数据库中的不匹配,也有可能是未找到。
本人是因为在POJO.hbm.xml中<id name="id" column="id" type="long" unsaved-value="null">
POJO中的id属性类型为long类型(基本数据类型,无数据时,值为0)。
测试:现在new()一个POJO,long默认id值肯定为0,在hibernate-mapping中找到这个POJO节点后,发现它的id的unsaved-value为null,此时无法匹配,后续判断的操作也就无从下手,于是出现上述错误。

------
occurred while calling setter of relation.ClassPO.id
------

这个问题是告诉我们对象的属性与hbm文件中配置的存储属性不匹配。如上例:relation包中的ClassPO对象中的id属性与ClassPO.hmb.xml中<id>标签类型不匹配。


------
正在学习。。发现错误后,会立即更新,申明:本文非官方解释,纯属个人猜测。。。
------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值