– 原作者: 尚硅谷-佟刚
increment:在原来的基础上自增
identity:主键自增(适用MySQL)
hilo:采用高低算法来生成主键
native:依据底层数据库对自动生成标识符的支持能力(跨平台)
News news1=(News)session.get(News.class, 1);
news1.setTitle("GG");
dynamic-update:属性设置为false,true时SQL语句的变化
false:
Hibernate:
update
NEWS
set
TITLE=?,
AUTHOR=?,
DATE=?,
CONTENT=?,
IMAGE=?
where
id=?
true:
Hibernate:
update
NEWS
set
TITLE=?
where
id=?
update 方法:
1.若更新一个持久化对象,不需要显示的调用update方法.
因为在调用Transaction的commit()方法时,会先执行session的 flush方法
2.更新游离对象时,需要现实的调用session的update方法.可以把一个游离对象变为一个持久化对象
需要注意的:
1.无论要更新的游离对象和数据表得记录是否一致,都会发送update语句
如何让update方法不盲目的触发update语句呢?
在.hbm.xml文件的class节点设置select-before-update=true(默认false)
但通常不需要设置该属性.
2.若数据表中没有对应的记录,但还调用了update方法,会抛出异常.
3.当update()方法关联一个游离的对象时,如果session缓存中已经存在相同OID的持久化对象,会抛出异常
因为在session缓存中不能有两个OID相同的对象.
get VS load:
1.执行get方法:会立即加载对象
执行load方法,若不使用该对象,则不会立即执行查询操作,而返回一 个代理对象 get是立即检索,load是延迟检索
2.load方法可能会抛出 LazyInitializationException异常
在需要初始化代理对象之前已经关闭了Session
3.若数据表中没有对应的记录,且Session也没有被关闭,同时需要使用对象时.get 返回null load 抛出异常.
refresh():会强制发送select语句,以使Session缓存中的对象的状态和数据表中的对应的记录保持一致!
flush:使数据表中的记录和Session缓存中的对象的状态保持一致,为了保持一致,则可能会发送对应的sql语句
1.在Transaction的commit()方法中,先调用session的flush方法,再提交事务
2.flush()方法可能会发送sql语句,但不会提交事务.
3.注意: 在未提交事务或显示调用session.flush()方法之前,也有可能会进 行flush操作.
1).执行HQL或QBC查询,会先进行flush()操作,已得到数据表中最新的记 录
2).若记录的ID是由底层数据库使用自增的方式生成的,则会在调用save方法后,就立即发送INSERT语句
因为save方法后,必须保证对象的ID是存在的!