欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate的坑

程序员文章站 2022-06-20 10:41:39
...

最近接手的一个项目,用的对象关系映射框架是Hibernate,虽然以前也有接触过,但只有在实际使用过程中才会更加了解它,言外之意:跳的坑多才能不再掉进坑里。作为之前一直使用MySql的我,对Hibernate简直是欲与泪先流。下面就说说我碰到的Hibernate的坑。

在使用Hibernate时实体里声明另一实体,通过OnToOne等关联,会在数据库生成索引和外键

Hibernate的坑

千变万化的需求!不知道哪一天需求改了,如果以后要更新business_id字段时,就会报错以下错误:

Cannot add or update a child row: a foreign key constraint fails

出现这种问题,我也是很苦恼,一个后台管理系统,一个app接口,两个有关联的项目,用了不同的映射框架,我真的是醉了~ 网上找了很多方法,很多都太麻烦。对于Hibernate和MySql真的是相爱相杀。

最后我把外键和索引删了,在Hibernate中不使用OneToOne等关联。

当然我注意到MySql的外键约束

ON DELETE、ON UPDATE表示事件触发限制,可设参数:
RESTRICT(限 制外表中的外键改动)
CASCADE(跟随外键改动)c
SET NULL(设空值)
SET DEFAULT(设默认值)
NO ACTION(无动作,默认的)
如果有什么好的办法能解决这个问题,希望好心人能给出个建议。

使用Hibernate获取对象时,没有调用save或update方法,数据库里的字段值会修改

通常我们获取一个对象,在修改对象值之后,若要保存到数据库,则需调用save或者update方法更新数据库,但Hibernate有时候太神奇了,我并没有保存,就在方法体执行完成之后修改了~有时候弄得莫名其妙的,有时候自动的东西真不一定是个好事啊。

如果项目中你使用了缓存,可得注意以下这个问题

从session获取对象时,你可能获取到的不是真实的对象

通常我们获取利用缓存提升性能,降低数据库压力,但是在使用Hibernate时并使用懒加载,使用session获取对象可能获取到的是一个代理对象。这个代理对象保存的是我们要查询的数据的信息。

什么是懒加载?他的作用?

延迟加载,也叫懒加载,它是Hibernate为提高程序执行效率而提供的一种机制,即只有真正使用该对象的数据时才会创建。

当我们要修改这个对象的数据时,可能会发生no session的错误,这是因为事务已经提交session已经关闭,而我们还要去查询数据库,所以hibernate就报错。

解决方案:通过对象的主键查询一次数据库赋给新的对象,再进行数据操作。

Hibernate执行SQL语句时间

以前写代码的执行顺序,都是一步一步往下走~使用Hibernate之后有一次DEBUG一个方法体执行了两条插入语句,但是发现在过了第一条插入语句时,数据库并未插入数据,最后发现在return语句执行之后数据才被一起插入。

使用Hibernate的过程当中,还是体验到了一些它的优势,封装性更强,对象之间的关联关系更紧密,同时也提供的简单的CRUD方法。对于一些简单的SQL操作,也比MySql更方便,省去了xml的编写。同时其级联操作更是能体现出它的优势,而MySql给我的感觉则更加*。

对于一些数据库字段不常修改,需求不常变更,对象关系更加清晰的项目中,Hibernate的优势应该会更加的显而易见

But! 需求不变更那还叫需求吗~ (偷笑,溜)

相关标签: 数据库 Hibernate