一.前言
上文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的管理,再次查询该对象还是会从数据库中取。
分享到:
相关推荐
本书的核心内容可能包括以下几个方面: 1. **Hibernate基础**:介绍Hibernate的基本概念、架构和安装配置,包括如何在项目中集成Hibernate,以及配置hibernate.cfg.xml文件。 2. **对象关系映射(ORM)**:详述...
`Session`具有以下几个关键特性: 1. **非线程安全**:由于`Session`不是线程安全的,因此在多线程环境中,每个线程都应有自己的`Session`实例,以避免数据存取的混乱。 2. **轻量级**:`Session`的创建和销毁相对...
实现Session的方法涉及到以下几个关键步骤: 1. **连接管理**:需要维护数据库连接池,确保高效地获取和释放数据库连接。 2. **事务处理**:在Session方法中通常会包裹在一个事务中,以确保数据操作的一致性和完整...
此注解包含几个关键属性,如`targetEntity`指定关联的实体类,`mappedBy`用于指定在子实体中的反向引用字段,`cascade`控制级联操作,以及`fetch`定义加载策略。 ```java @Entity public class User { @OneToMany...
在Hibernate框架中,Session是与数据库交互的主要接口,它负责对象的持久化操作。然而,由于Session不是线程安全的,所以在多线程环境中管理Session就需要特别注意。本篇文章将详细探讨Hibernate中Session的管理,...
在Java的持久化框架Hibernate中,Session对象是与数据库交互的核心组件,它负责管理对象的持久状态。在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session...
Session对象负责管理实体对象的状态,包括保存、更新、删除和检索数据。它的生命周期主要包括以下几个阶段: 1. **创建Session**: 当我们调用`SessionFactory.openSession()`方法时,一个新的Session实例就会被...
避免这个问题的方法是在访问懒加载属性之前确保Session仍然打开,或者显式地在需要时加载属性,如使用`Hibernate.initialize()`方法。 ### 5. MappingException - **MappingException: Error reading resource**:...
在多表连接查询的场景下,Hibernate提供了几种不同的方法来处理数据关联,包括HQL(Hibernate Query Language)查询、Criteria API以及传统的JPA(Java Persistence API)注解。 1. **HQL查询**: Hibernate Query...
比如,`save()`方法用于保存一个新的对象到数据库,`update()`用于更新已存在的对象,而`delete()`则是删除对象。 三、Session的事务管理 在Hibernate中,Session与数据库交互时通常是在事务中进行的。你可以使用...
书中可能涵盖以下几个关键知识点: 1. **对象关系映射(ORM)**:ORM是Hibernate的基础,它通过将Java对象映射到数据库表,实现了对象与数据的透明转换,使得开发人员无需关注底层SQL,更专注于业务逻辑。 2. **...
“lib”文件夹中的jar包包含了Hibernate运行所必需的类库,主要包括以下几个关键组件: - hibernate-core.jar:这是Hibernate的核心库,包含了许多核心接口和实现,如Session、SessionFactory、Query等。 - antlr...
在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它使得开发者可以更加方便地处理数据库操作。本篇文章将探讨如何对Hibernate的`Session`进行简单的包装,以提升代码的可维护性和灵活性。...
Hibernate的核心API围绕着几个关键组件展开: - **Configuration**: 负责管理数据库连接信息,通过加载配置文件(如myhibernate.xml)来初始化框架。 - **映射文件**: 定义了Java对象与数据库表之间的映射规则,是...
在 Hibernate 中,ORM 的实现主要包括以下几个方面: - **实体类**:表示数据库表中的一行数据,通常一个表对应一个实体类。 - **Session**:Hibernate 提供的用于操作数据库的基础接口,负责执行 CRUD 操作。 - **...
本文将针对几个常见的Hibernate错误进行深入分析,并提供相应的解决方法。这些错误包括但不限于 `org.springframework.orm.ObjectRetrievalFailureException`、`org.springframework.beans.factory....
Hibernate的体系结构主要包括以下几个关键组件: - **SessionFactory**: 它是Hibernate框架中最重要的对象之一,负责构建Session对象。SessionFactory在整个应用中通常是单例模式。 - **Session**: Session对象是...
Hibernate操作数据库时,主要通过以下几个核心组件来实现持久层操作: 1. **Session**:Session是Hibernate用来和数据库进行交互的一个轻量级对象,它相当于JDBC中的Connection。Session对象是应用程序与数据库进行...
13. **实体生命周期**:Hibernate定义了几个关键的生命周期状态,如瞬时态、持久态、游离态和脱管态,理解这些状态有助于更好地管理对象。 本套课件详细讲解了上述知识点,并可能包含实际案例和练习,是学习...