- oracle数据库中不允许同时存在两个long类型的数据.
- 能用set就不用list,因为set是无序的,比list少生成一个下标字段
- table属性可以省略,默认表名和对应的实体类的数组或集合等属性名一致, column属性可以省略,默认字段名和实体类属性名一致,type和length也可以省略,默认类型和长度根据上下文判断.
- SQL语句中的这种形式属于联合主键,意思是任意一个单独的主键可以重复,但是两个主键完全相同的情况不可以发生.
- 每创建一个表都要创建一个对应的映射文件,单向一对多外键设在多的一方,我们在一的那一方添加一个set集合属性,然后在配置文件中添加该属性的对应的外键关联
- 注意set集合中的两个对象需要分别save到表中, 后面的user.setGoodsItemSet(goodsItemsset);作用仅仅是给主表中的属性赋值,否则
- 查询. 方法是session.load/get(Class class,int id);load和get的区别是load是延迟加载的,查询才会加载,不查询就不会加载.
- 只有集合才能clear,对象只能set(null),一对一在丛方解除,一对多在丛方解除,多对多删除中间表数据,实际上解除关系就是让外键关联的值为空就可以了.
对象的状态
四种:临时态(瞬时态丶新建态)、持久态、游离态、删除态
- 瞬时态:对象刚刚创建,对象的数据在表中还没有保存,并且对象也没有在session的缓存中
- 持久态:对象的数据已经在表中保存了,并且这个对象也在session的缓存中保存
- 游离态:对象的数据在表中存在,但是对象不在session缓存中保存(session被关闭)
- 删除态:session调用delete方法对对象进行操作之后
- 实际上对象的状态和session的方法调用是有关的,主要是要知道的是用什么方法可以将一个状态改为另一个什么状态
evict()方法的作用是从session缓存中将指定的对象删除
clear()方法的作用是将session缓存中所有对象删除
hibernate中的缓存
hibernate中的缓存分为两级:一级缓存和二级缓存
一级缓存:session中的缓存
二级缓存:工厂缓存
session中除了一级缓存之外还多了一个快照区.
快照区存在的意义是:
当查询到的对象数据,调用set方法进行数据修改时,如果set方法的调用没有实质性的修改原数据,那么即使session调用update方法想实现update更新操作,但是一级缓存和快照区进行当前对象的对比,发现数据完全相同,因此不会发送update语句;
只有set方法调用数据发生实质性的改变,session调用update方法更新数据时,一级缓存和快照区对比当前对象数据,发现不同,才发送update语句。