Hibernate 积累

 解决实体类或属性名与数据库关键字冲突

除了在hbm.xml中加column属性或table属性来改变列名或数据库表名字外,如果移植数据后不准改数据库属性名的话还可以在column属性或table属性加上反引号把它当做字符串来处理。

cascade和inverse

Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作,常用的cascade:none,all,save-update ,delete, lock,refresh,evict,replicate,persist,merge,delete-orphan(one-to-many) 。一般对many-to-one,many-to-many不设置级联,在<one-to-one>和<one-to-many>中设置级联。
inverse表“是否放弃维护关联关系”(在Java里两个对象产生关联时,对数据库表的影响),在one-to-many和many-to-many的集合定义中使用,inverse=”true”表示该对象不维护关联关系;该属性的值一般在使用有序集合时设置成false(注意hibernate的缺省值是false)。one-to-many维护关联关系就是更新外键。many-to-many维护关联关系就是在中间表增减记录
注: 配置成one-to-one的对象不维护关联关系
上次提过的inverse,在list,array等有序的容器里面是不能使用的,很简单,都放弃多关系的维护了,还会在乎元素的顺序么。
还有一点,在多的一端,不允许放弃对关系的维护。
多对多关系的维护,双方处于平等地位,那么谁来维护都是可以的,注意多对多关系的维护是在中间表插入一条新的记录,如果双方都维护,那么就不是重复update语句的问题了,就会产生插入异常。

generator子标签常用class属性
increment Hibernate内部自己做累加,而不是数据库中做累加。所以集群下不要使用。
indentity 数据库标示符自增长
squence Oracle常用
hilo 高低位 数据库保存高位字段,Hibernate累加地位字段,新插入数据由这两个字段组成,不会重复。
uuid 生成主键不用访问数据库,Hibernate生成,插入效率很高,可移植性好,而像indentity,squence插入时都要先访问数据库。主键string类型,查询时候效率不高。
native 根据数据库底层能力选择identity squence hilo
assigned 手工分配主键
foreigh 外键引用作为主键

N+1次查询和懒加载
        1.用Query.iterator可能会有N+1次查询。
2.懒加载时获取关联对象。
3.如果打开对查询的缓存即使用list也可能有N+1次查询。

猜你喜欢

转载自justsee.iteye.com/blog/1063422