一.前言
上文Hibernate学习二:Hibernate对象状态及转换中描述了hibernate中对象的三种状态。自然的,对session中的许多方法,save(),update(),saveOrUpdate(),merge(),delete()方法,我都有了自己的想法:传什么状态的对象做为这些方法的参数,方法返回给我什么状态的对象。为了验证自己的想法,也为了方便别人,遂做此文。
二.你需要知道以下知识
如果你不愿意参考上面一篇文章,没关系,记住下面三句话:
- 临时状态对象未和任何一个session相关联,在数据库里没有对应记录,对象没有数据库标识的OID。
- 持久化状态对象和session相关联,在数据库有对应记录,对象多了一个数据库标识的OID。
- 游离状态对象不和任何一个session ,但在数据库有对应记录,对象多了一个数据库标识的OID。
三.public Serializable save(Object object) throws HibernateException;
- object是临时状态对象:直接插入记录。返回此记录对应的持久化对象。
- object是持久化状态对象:根据id先select这条记录,判断是否有更改,有则update,无则不处理。返回此记录对应的持久化对象。
- object是游离状态对象(奇葩的方法,一般没人这么搞吧):根据id先select这条记录,无论是否有更改,插入一条新记录,原记录仍然存在。返回此新记录对应的持久化对象。
public void test() {
Session session = getSession();
Transaction tr = session.beginTransaction();
//临时状态对象 执行以下sql
//Hibernate: insert into test.user (name, password) values (?, ?)
// User user = new User();
// user.setName("sa");
// user.setPassword("sa");
// session.save(user);
//持久化状态对象 执行以下sql
//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
//Hibernate: update test.user set name=?, password=? where id=?
// User user = (User) session.load(User.class, 1);
// user.setName("s6dd"); //如果user[1]对象以前的Name就是s6dd,不执行update语句
// session.save(user);
//游离状态对象 执行以下sql
//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
//Hibernate: insert into test.user (name, password) values (?, ?)
Session session2 = getSession();
User user = (User) session2.load(User.class, 1);//当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该 po状态就处于detached,
session2.delete(user);
session2.close();
user.setName("sb");
session.save(user);
tr.commit();
session.close();
}
四.public void update(Object object) throws HibernateException;
- object是临时状态对象:直接执行update,但临时状态对象没有持久化OID,抛异常,org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1。
- object是持久化状态对象:根据id先select这条记录,判断是否有更改,有则update,无则不处理。
- object是游离状态对象:根据id先select这条记录,无论是否有更改,都执行update操作。
public void test() {
Session session = getSession();
Transaction tr = session.beginTransaction();
//临时状态对象 执行以下sql
//Hibernate: update test.user set name=?, password=? where id=?
// User user = new User();
// user.setName("sa");
// user.setPassword("sa");
// session.update(user);
//持久化状态对象 执行以下sql
//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
//Hibernate: update test.user set name=?, password=? where id=?
// User user = (User) session.load(User.class, 1);
// user.setName("sx122"); //如果user[1]对象以前的Name就是s6dd,不执行update语句
// session.update(user);
//游离状态对象 执行以下sql
//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
//Hibernate: update test.user set name=?, password=? where id=?
Session session2 = getSession();
User user = (User) session2.load(User.class, 19);//当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该 po状态就处于detached,
session2.delete(user);
session2.close();
user.setName("2sb");
session.update(user);
tr.commit();
session.close();
}
五.public void saveOrUpdate(Object object) throws HibernateException;
- object是临时状态对象:直接执行save。此时saveOrUpdaue=save。
- object是持久化状态对象:根据id先select这条记录,判断是否有更改,有则update,无则不处理。此时saveOrUpdaue=save=update。
- object是游离状态对象:根据id先select这条记录,无论是否有更改,都执行update操作。此时saveOrUpdaue=update。
public void test() {
Session session = getSession();
Transaction tr = session.beginTransaction();
//临时状态对象 执行以下sql
//Hibernate: insert into test.user (name, password) values (?, ?)
// User user = new User();
// user.setName("sa");
// user.setPassword("sa");
// session.saveOrUpdate(user);
//持久化状态对象 执行以下sql
//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
//Hibernate: update test.user set name=?, password=? where id=?
// User user = (User) session.load(User.class, 1);
// user.setName("s6dd"); //如果user[1]对象以前的Name就是s6dd,不执行update语句
// session.saveOrUpdate(user);
//游离状态对象 执行以下sql
//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
//Hibernate: update test.user set name=?, password=? where id=?
Session session2 = getSession();
User user = (User) session2.load(User.class, 19);//当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该 po状态就处于detached,
session2.delete(user);
session2.close();
// user.setName("2sb");
session.saveOrUpdate(user);
tr.commit();
session.close();
}
六. public Object merge(Object object) throws HibernateException;
- object是临时状态对象:同saveOrUpdate。
- object是持久化状态对象:同saveOrUpdate。
- object是游离状态对象:根据id先select这条记录,判断是否有更改,有则update,无则不处理。
public void test() {
Session session = getSession();
Transaction tr = session.beginTransaction();
//临时状态对象 执行以下sql
//Hibernate: insert into test.user (name, password) values (?, ?)
// User user = new User();
// user.setName("sa");
// user.setPassword("sa");
// session.merge(user);
//持久化状态对象 执行以下sql
//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
//Hibernate: update test.user set name=?, password=? where id=?
// User user = (User) session.load(User.class, 1);
// user.setName("s6dd"); //如果user[1]对象以前的Name就是s6dd,不执行update语句
// session.merge(user);
//游离状态对象 执行以下sql
//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
//Hibernate: update test.user set name=?, password=? where id=?
Session session2 = getSession();
User user = (User) session2.load(User.class, 19);//当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该 po状态就处于detached,
session2.delete(user);
session2.close();
user.setName("2sb");session.merge(user);
tr.commit();
session.close();
}
七.public void delete(Object object) throws HibernateException;
- object是临时状态对象:居然不执行delete语句,难道是自动优化,session发现这个临时对象没有OID,忽略此次delete。
- object是持久化状态对象:直接delete记录,并清空session中对应缓存。
- object是游离状态对象:直接delete。
public void test() {
Session session = getSession();
Transaction tr = session.beginTransaction();
//临时状态对象 不执行sql
// User user = new User();
// user.setName("sa");
// user.setPassword("sa");
// session.delete(user);
//持久化状态对象 执行以下sql
//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
//Hibernate: delete from test.user where id=?
// User user = (User) session.load(User.class, 19);
// session.delete(user);
//游离状态对象 执行以下sql
//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
//Hibernate: delete from test.user where id=?
Session session2 = getSession();
User user = (User) session2.load(User.class, 20);//当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该 po状态就处于detached,
session2.delete(user);
session2.close();
session.delete(user);
tr.commit();
session.close();
}
七.saveOrUpdate()和merge()
- saveOrUpdate后的对象会纳入session的管理,对象的状态会跟数据库同步,再次查询该对
象会直接从session缓存中取。
- merge后的对象不会纳入session的管理,再次查询该对象还是会从数据库中取。
分享到:
相关推荐
处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 Java对象在JVM中的 生命周期 179 8.2 理解Session的缓存 181 8.2.1 Session的缓存的作用 182 ...
处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 Java对象在JVM中的 生命周期 179 8.2 理解Session的缓存 181 8.2.1 Session的缓存的作用 182 ...
Hibernate的第二级缓存是一个插件,下面是几种常用的缓存插件: EhCache SwarmCache JBossCache等. 其中,EhCache是Hibernate的默认的插件. 四 EhCache的使用 第一步:修改Hibernate配置文件,启用...
Hibernate Web应用的开发一般经过以下几个步骤: (1)创建数据库。 (2)将Hibernate所需的JAR包复制到WEB-INF/lib下。 (3)创建Hibernate的配置文件。 (4)利用Hibernate的第三方工具或Eclipse的有关插件从...
当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 在获取便利操作的同时,SQL的注入问题也值得我们的密切注意,...
wait()是Object类的方法,对此对象调用了wait方法导致本线程放弃对象锁,进入等待锁定池,只有针对此对象发出notify方法后本线程才进入对象锁定池准备获得对象锁进入运行状态。 同步和异步,在什么情况下分别使用? ...
DOM以及广义的基于树的处理具有几个优点 399 文档对象模型(DOM)解析实例 402 DOM对象 404 DOM解析的例子: 406 SAX解析实例 409 DOM4J解析实例 412 JDOM解析实例 413 JAVA操纵XML 实例讲解 414 通过JAVA写数据到...
Spring针对几个著名的Web服务器的数据源提供了相应的JDBC抽取器: •WebLogic:WebLogicNativeJdbcExtractor •WebSphere:WebSphereNativeJdbcExtractor •JBoss:JBossNativeJdbcExtractor 在定义了JDBC...
151、在servlets和JSP之间能共享session对象吗? 37 152、如何设置cookie在某一时间后过期? 37 153、如何获得当前的sessions数? 37 154、能设置一些代码在我所有的JSP文件之上运行?如果可以,能共享吗? 37 155、...
151、在servlets和JSP之间能共享session对象吗? 37 152、如何设置cookie在某一时间后过期? 37 153、如何获得当前的sessions数? 37 154、能设置一些代码在我所有的JSP文件之上运行?如果可以,能共享吗? 37 155、...
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...
Hibernate的核心接口一共有5个,分别为:Session、SessionFactory、Transaction、Query和Configuration。这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。 ...
因此,在具体设计实现该博客网站时,主要考虑了主流博客网站的几个主要功能:(1)博客的注册、登录验证功能(2) 网络用户通过关键字搜索博文功能(3) 最热门博客页面推荐浏览(4) 文章详细内容及相关评论显示(5) 博客...
以“%”开头,[第几个数值$][flags][宽度][.精确度][格式] printf()的引入是为了照顾c语言程序员的感情需要 格式化输出 Formatter;格式化输入 Scanner;正则表达式 输出格式控制: 转义符: \ddd 1到3位8...
16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 17.介绍一下Hibernate的二级缓存 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message 属性, ...
16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...