Hibernate annotation 学习笔记(7)

2018-11-28 15:49

Hibernate—annotation 学习笔记 第31页 共109页

*/ User user = (User)session.get(User.class, 1); //数据加载完后的状态为persistent状态。数据将与数据库同步。 System.out.println(\ + user.getName()); //因为此的user为persistent状态,所以数据库进行同步为龙哥。 user.setName(\龙哥\); session.getTransaction().commit(); e.printStackTrace(); session.getTransaction().rollback(); if (session != null){ } if (session.isOpen()){ } session.close(); } catch (HibernateException e) { } finally{ 6、 load()与get()区别

①、 不存在对应记录时表现不一样;

②、 load返回的是代理对象,等到真正使用对象的内容时才发出sql语句,这样就要求在第一次使用对象时,要求

session处于open状态,否则出错

③、 get直接从数据库加载,不会延迟加载

get()和load()只根据主键查询,不能根据其它字段查询,如果想根据非主键查询,可以使用HQL 7、 update()

① ② ③ ④ ⑤

、用来更新detached对象,更新完成后转为为persistent状态(默认更新全部字段) 更新transient对象会报错(没有ID)

更新自己设定ID的transient对象可以(默认更新全部字段)

persistent状态的对象,只要设定字段不同的值,在session提交时,会自动更新(默认更新全部字段) 更新部分更新的字段(更改了哪个字段就更新哪个字段的内容) a) 方法1:update/updatable属性

xml:设定标签的update属性,设置在更新时是否参数更新

注意:update可取值为true(默认):参与更新;false:更新时不参与更新 annotateon:设定@Column的updatable属性值,true参与更新,false:不参与更新 @Column(updatable=false) public String getTitle() {return title;} 注意:此种方法很少用,因为它不灵活 b) 方法二:dynamic-update属性

注意:此方法目前只适合xml方式,JAP1.0 annotation没有对应的

在实体类的映射文件中的标签中,使用dynamic-update属性,true:表示修改了哪个字段就更新哪个字段,其它字段不更新,但要求是同一个session(不能跨session),如果跨了session同样会更新所有的字段内容。

代码: @Test public void testUpdate5() { Hibernate—annotation 学习笔记 第32页 共109页 Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); Student s = (Student)session.get(Student.class, 1); s.setName(\); //提交时,会只更新name字段,因为此时的s为persistent状态 session.getTransaction().commit(); s.setName(\); Session session2 = sessionFactory.getCurrentSession(); session2.beginTransaction(); //更新时,会更新所有的字段,因为此时的s不是persistent状态 session2.update(s); session2.getTransaction().commit(); } 如果需要跨session实现更新修改的部分字段,需要使用session.merget()方法,合并字段内容 @Test public void testUpdate6() { Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); Student s = (Student)session.get(Student.class, 1); s.setName(\); session.getTransaction().commit(); s.setName(\); Session session2 = sessionFactory.getCurrentSession(); session2.beginTransaction(); session2.merge(s); session2.getTransaction().commit()} 这样虽然可以实现部分字段更新,但这样会多出一条select语句,因为在字段数据合并时,需要比较字段内容是否已变化,就需要从数据库中取出这条记录进行比较 c) 使用HQL(EJBQL)面向对象的查询语言(建议) @Test public void testUpdate7() { } Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); Query q = session.createQuery( \Student s set s.name='z5' where s.id = 1\); q.executeUpdate(); session.getTransaction().commit(); 8、 saveOrUpdate()

在执行的时候hibernate会检查,如果对象在数据库中已经有对应的记录(是指主键),则会更新update,否则会添加数据save 9、 clear()

清除session缓存

无论是load还是get,都会首先查找缓存(一级缓存,也叫session级缓存),如果没有,才会去数据库查找,调用clear()方法可以强制清除session缓存

Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); Teacher t = (Teacher)session.load(Teacher.class, 1); System.out.println(t.getName()); session.clear(); Hibernate—annotation 学习笔记 第33页 共109页

Teacher t2 = (Teacher)session.load(Teacher.class, 1); System.out.println(t2.getName()); session.getTransaction().commit(); 注意:这样就会发出两条SELECT语句,如果把session.clear()去除,则只会发出一条SELECT语句,因为第二次load时,是使用session缓存中ID为1的对象,而这个对象已经在第一次load到缓存中 了。 10、 flush()

在hibernate中也存在flush这个功能,在默认的情况下session.commit()之前时,其实执行了一个flush命令。 Session.flush功能: ? ?

Session在什么情况下执行flush:

①?? 默认在事务提交时执行; 注意:flush时,可以自己设定,使用session.setFlushMode(FlushMode)来指定。 session.setFlushMode(FlushMode); FlushMode的枚举值: ? FlushMode.ALWAYS:任务一条SQL语句,都会flush一次 ? FlushMode.AUTO :自动flush(默认) ? FlushMode.COMMIT: 只有在commit时才flush ? FlushMode.MANUAL:手动flush。 ? FlushMode.NEVER :永远不flush 此选项在性能优化时可能用,比如session取数据为只读时用,这样就

不需要与数据库同步了 注意:设置flush模式时,需要在session开启事务之前设置。 ②?? 可以显示的调用flush; ③?? 在执行查询前,如:iterate. 注:如果主键生成策略是uuid等不是由数据库生成的,则session.save()时并不会发出SQL语句,只有flush时才会发出SQL语句,但如果主键生成策略是native由数据库生成的,则session.save的同时就发出SQL语句。 清理缓存;

执行sql(确定是执行SQL语句(确定生成update、insert、delete语句等),然后执行SQL语句。)

11、 evict()

例如:session.evict(user) 作用:从session缓存(EntityEntries属性)中逐出该对象 但是与commit同时使用,会抛出异常 session = HibernateUtils.getSession(); tx = session.beginTransaction(); User1 user = new User1(); user.setName(\李四\); user.setPassword(\); user.setCreateTime(new Date()); user.setExpireTime(new Date()); //利用Hibernate将实体类对象保存到数据库中,因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理,不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false session.save(user); session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象 //无法成功提交,因为hibernate在清理缓存时,在session的临时集合(insertions)中取出user Hibernate—annotation 学习笔记 第34页 共109页

对象进行insert操作后需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将user从session中逐出了,所以找不到相关数据,无法更新,抛出异常。 tx.commit(); 解决在逐出session缓存中的对象不抛出异常的方法: 在session.evict()之前进行显示的调用session.flush()方法就可以了。 session.save(user); //flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象清除,并且会设置session中的existsInDatabase状态为false session.flush(); session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象 //可以成功提交,因为hibernate在清理缓存时,在Session的insertions中集合中无法找到user对象所以不会发出insert语句,也不会更新session中existsInDatabase的状态。 tx.commit(); Hibernate—annotation 学习笔记 第35页 共109页

第15课 持久化对象的三种状态

一、 瞬时对象(Transient Object):

使用new操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收 二、 持久化对象(Persistent Object):

持久实例是任何具有数据库标识的实例,它有持久化管理器Session统一管理,持久实例是在事务中进行操作的----它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。

三、 离线对象(Detached Object):

Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受hibernate管理。

四、 三种状态的区分:

1、 有没有ID,(如果没有则是Transient状态) 2、 ID在数据库中有没有 3、 在内存里有没有(session缓存) 五、 总结:

Transient对象:随时可能被垃圾回收器回收(在数据库中没有于之对应的记录,应为是new初始化),而执行save()方法后,

就变为Persistent对象(持久性对象),没有纳入session的管理

内存中一个对象,没有ID,缓存中也没有 内存中有、缓存中有、数据库有(ID)

Persistent对象:在数据库有存在的对应的记录,纳入session管理。在清理缓存(脏数据检查)的时候,会和数据库同步。 Detached对象:也可能被垃圾回收器回收掉(数据库中存在对应的记录,只是没有任何对象引用它是指session引用),注引

状态经过Persistent状态,没有纳入session的管理

内存有、缓存没有、数据库有(ID)

newTransientsave()saveOrUpdate()Garbage(回收)Delete()get()load()find()iterate()etc.Persistentevict()close()*clear()*update()saveOrUpdate()lock)()Garbage(回收)Detached


Hibernate annotation 学习笔记(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:儿童文明礼仪小故事(共4篇)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: