Hibernate的坑
最近接手的一个项目,用的对象关系映射框架是Hibernate
,虽然以前也有接触过,但只有在实际使用过程中才会更加了解它,言外之意:跳的坑多才能不再掉进坑里。作为之前一直使用MySql
的我,对Hibernate
简直是欲与泪先流。下面就说说我碰到的Hibernate
的坑。
在使用Hibernate时实体里声明另一实体,通过OnToOne等关联,会在数据库生成索引和外键
千变万化的需求!不知道哪一天需求改了,如果以后要更新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! 需求不变更那还叫需求吗~ (偷笑,溜)
上一篇: struts2 标签 if 判断一个字符
下一篇: JS数据类型