Session接口
容易混淆的概念;
save()方法
将一个实例加入到缓存中。并不是在缓存中拷贝一份这个实例。
所以当一个实例由临时对象或者游离对象转为持久化对象后,地址不变。
将任何一个实例转入持久化对象这个过程:
1.将对象的OID赋新值。
2.将对象加入缓存。
merge()方法
当缓存里已有一个对象时,此时将一个游离对象(两者OID相同)update,/;会报错。
必须用merge方法.
update()方法
先决条件,对象不能是已经在缓存中有相同OID的游离对象。否则用merge方法。
<class select-before-update="true/false">属性意义
更新前先select一下,看看哪些属性更新了。没有则不更新。用在不经常变动的类。
在做双向关联时,在session内先做一个一对多关联,此时这只是在缓存做了一对多关联。所以这时想要反查,多对一,则查询不到,除非再做多对一,可以查到。要么就是做完一对多时,关闭session,让数据入库,再打入session查多对一,这时数据出来了。
所以对于session里的操作,大家一定要脑子时刻清楚,这只是对内存操作,而不是数据库。
关联的概念
孙卫琴说的好,关系数据库只有多对一的概念。一对多是多对一的双向关联。
所以必须先 many-to-one,才能 one-to-many。由于在hibernate里,类即是表 的概念,所以关联以实体类做外键。
外键的定义先要弄清楚,百度知道上是这么写的。
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。
外键的作用:
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!
这段话用hibernate来配置是这样:
<one-to-many name>
<key column="从表中的外键字段">
<class name="从表" />
</one-to-many>