一、关于对象的三种状态:
1、transient (内存有,数据库没有,没有ID) 2、persistent(数据库有,内存有,缓存也有 有ID) 3、detached.(数据库有,内存有,缓存没有,有ID)
二、关于关联
1、one2one_uni_fk @oneToOne@JoinColumn(name="XXXid")
2、one2one_bin_fk @OneToOne @JoinColunm(name="XXXid") 另一方@oneToOne(mappedBy=“XXX”)
3、many2one_uni @manyToOne
4、one2many_uni @OneToMany @JoinColumn(name="XXid")
5、one2many_many2one_bin @manyToOne 另一方 @oneToMany(mappedBy="XXX")
三、关于load与get的区别
1、get直接发出SQL语句去查询。
2、load是产生一个proxy(代理)对象,等到用到时再去查询,代理对象会随着session的提交而消失。
四、关于1+N问题
1、many2one 发出一条语句去查询时会先去查询要查询的东西,在发出N条去查询被关联的对象。
2、one2many发出一条语句去查询要查的东西的东西,再发出N条语句去查询被关联的对象。
3、使用iterate()方法也会产生1+问题,因为iterate()时当session没有所查询的东西是,就会到数据库去查,首先查的是ID,然后再发出N条语句将对象查出来。
4、解决方案1,fetch=FetchType.ERGER 改为 fetch=fetchType.LAZY;
解决方案2 @bathchSize(size=XX)
解决方案3 join fetch。
解决方案4 用criteria查询createCriteria(fromXXX.class) .
五、list()与iterate()的 区别
1、list发出一次查询取所有。
2、iterate先取ID,然后根据ID再取对象。
3、list第二次查询还是数据库去查询,发出SQL语句,iterate会到session里面找,不发出SQL语句。
六、关于cascade与fetch
1、cascade=cascadeType.ALL 负责CUD(增加、更新、删除),这样设置会关联到CUD。
2、fetch=FetchType.ERGER 会关联到被关联对象,设为fetch=fetchType.lazy 就不会。