`
Wind_ZhongGang
  • 浏览: 263689 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Hibernate save persist merge探究

阅读更多

 

  先来看看hibernate-reference.pdf上对persist和save的说明吧

 

  

 

  从上面得知persist和save方法都可以对持久化实体进行保存,但它们的作用范围却是有着明显的区别,当你调用persist方法对持久化实体进行保存时,它必须在事务的包裹下,如果脱离事务,那么是不会向数据库发送插入语句的,也就是说当你调用persist方法时,必须首先开启事务,而对于save方法来说不论在事务内外,它都会向数据库发送插入语句,不需要事务的包裹执行。

 

  这里有这样两个持久化实体,person和book,两者有一对多的双向关联关系,来看看我写的一个测试类吧

 

 

package com.aaxis;

import com.aaxis.model.Book;
import com.aaxis.model.Person;
import junit.framework.TestCase;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 10/24/11
 * Time: 11:50 AM
 */
public class HibernateCoreTest extends TestCase {

    public void testBook() throws Exception {
        Book book1 = new Book("book1", "booksssssss");
        Book book2 = new Book("book2", "booksssssss");
        List<Book> books = new ArrayList<Book>();
        books.add(book1);
        books.add(book2);
        Person person = new Person("person1", "personsssss", books);
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        session.save(person);
        System.out.println("person's id is " + person.id());Person personAfterFound = (Person) session.get(Person.class, person.id());
        System.out.println("person's name is " + personAfterFound.name());
        transaction.commit();
        session.close();
    }
}

 

  这里首先使用的是save方法,打印出来了person的id,如果将这里的save方法换成persist,同样的结果,也打印出来了person的id,并且当我们再在这个session里根据person的id去查找person时,并没有发出任何查询语句,所以从这里得知,当我们调用persist或save方法时,会将一个持久化实体状态由瞬时态转化为持久态,并且将该对象缓存在session当中。但是如果将这里的保存方法换成merge,那么这时输出的id就是空的,也就查找不到任何person对象了,研究源码发现merge方法还返回了一个Object,查看该方法的注释@return an updated persistent instance,返回了一个持久化对象,这个对象就是当我们保存时向该方法传递进去的对象,所以说当在调用merge方法,如果想使用该对象的持久化对象,需要使用的是merge返回的对象。

  • 大小: 37.4 KB
0
1
分享到:
评论

相关推荐

    save, saveOrUpdate, persist, merge, update 区别.docx

    在Java的持久化框架Hibernate中,管理对象与数据库之间的交互是通过一系列的方法完成的,其中包括`save()`, `saveOrUpdate()`, `persist()`, `merge()`, 和 `update()`。这些方法各有其特点和适用场景,理解它们的...

    Hibernate_级联关系说明_-_关于cascade和inverse的用法

    @org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE}) private User user; ``` 在上面的例子中,我们设置了`inverse=true`,这意味着 `Address` 实体不再负责维护与 `User` ...

    Hibernate的各种保存方式的区别详解

    Hibernate提供了多种保存方式,包括save()、persist()、update()、saveOrUpdate()等,了解这些方法的区别非常重要,以便正确使用它们。本文将对Hibernate的各种保存方式进行详细的比较和分析。 一、预备知识 在...

    hibernate_reference中文版和Hibernate中文手册

    5. CRUD操作:Hibernate提供了便捷的方法来完成创建(save()、persist())、读取(get()、load()、query())、更新(update()、merge())和删除(delete())对象的操作。其中,HQL(Hibernate Query Language)和...

    HibernateDemo(hibernate基本用法演示)

    - **创建(Create)**:使用 `Session` 的 `save()` 或 `persist()` 方法保存新实体到数据库。 - **读取(Read)**:通过 `get()` 或 `load()` 获取单个实体,`createQuery()` 或 `createSQLQuery()` 执行 HQL...

    Hibernate之API初识及增删改查实现案例hibernate003

    - **创建(Create)**:`Session.save()`或`Session.persist()`方法用于将对象保存到数据库,生成新的主键。 - **读取(Read)**:通过`Session.get()`、`Session.load()`或Criteria查询获取数据库中的对象。 - *...

    jap+hibernate4实现

    entityManager.persist(user); } else { entityManager.merge(user); } } // ... } ``` 5. **使用Repository**:在业务逻辑层,你可以通过依赖注入的方式使用上述DAO,执行CRUD操作。 6. **事务管理**:对于...

    hibernateDemo

    4. **持久化(Persistence)**:Hibernate提供了几种方式来实现对象的持久化,如`Session`接口提供的`save()`, `persist()`, `update()`和`merge()`方法。 5. **查询语言(HQL)**:Hibernate有自己的查询语言,即...

    最新的hibernate3.6.0jar包

    6. **实体生命周期**:Hibernate定义了实体的四个状态:瞬时态、持久态、托管态和脱管态,并提供了相应的方法来管理这些状态,如save()、update()、merge()、persist()等。 7. **多对一、一对多、多对多关系映射**...

    hibernate增删改查和动态sql

    - **创建(Create):** 通过`Session.save()`或`Session.persist()`方法将Java对象保存到数据库。 - **读取(Read):** 可以通过`Session.get()`、`Session.load()`或HQL查询来获取数据。 - **更新(Update):...

    hibernate 3.5文档下载

    通过Session的save(), persist(), merge()等方法,可以控制对象的状态转换。 8. **事务管理**:Hibernate提供了基于JTA(Java Transaction API)和JDBC的事务管理机制,确保数据库操作的原子性、一致性、隔离性和...

    hibernate的生命周期

    2. **持久态(Persistent)**:对象已经通过Session的save()或persist()方法与当前Session关联,并且数据库中有了对应的记录。当对象属性发生变化时,Hibernate会自动更新数据库中的记录。 3. **脱管态(Detached)...

    《深入浅出Hibernate》.pdf

    通过Session的save()或persist()方法,对象可以从瞬时态变为持久态,实现持久化。update()和merge()方法则用于更新已存在的持久化对象。 六、事务处理 Hibernate支持JTA和JDBC事务管理。Transaction接口提供了begin...

    传智Hibernate框架资料

    1. **持久化操作**: 通过Session的save()、persist()、update()、merge()方法完成对象的持久化。 2. **查询操作**: 使用Session的get()、load()获取单个对象,使用createQuery()或createCriteria()执行HQL或Criteria...

    hibernate5.5.4

    例如,使用Session对象的save()或persist()方法可实现对象的持久化,而get()和load()用于查询,update()和merge()用于更新,delete()则用于删除。 4. **级联操作**: 在关联映射中,Hibernate允许级联操作,这意味着...

    hibernate

    常见的`cascade`选项包括`SAVE_UPDATE`, `DELETE`, `MERGE`, `REFRESH`, `PERSIST`, 和 `ALL`。 #### Inverse 关联的拥有者 `inverse`属性用于指定哪一方负责维护关联关系。当设置`inverse=true`时,表示该实体...

    hibernate中文文档 HTML格式

    例如,使用`save()`或`persist()`方法创建新对象,`load()`或`get()`方法读取对象,`update()`或`merge()`方法更新对象,以及`delete()`方法删除对象。 3. 查询语言(HQL):Hibernate查询语言,类似于SQL,但面向...

    Hibernate语句

    3. `save() / persist()`: 保存或持久化对象到数据库。 4. `update() / merge()`: 更新已存在的数据库记录。 5. `delete()`: 删除数据库中的记录。 6. `commit()`: 提交事务,将所有操作写入数据库。 7. `flush()`: ...

    hibernate学习总结文档

    1. **创建(Create)**:使用 Session 的 `save()` 或 `persist()` 方法保存新对象到数据库。 2. **读取(Read)**:`get()` 或 `load()` 方法用于根据主键获取对象,`query()` 或 HQL(Hibernate 查询语言)用于...

Global site tag (gtag.js) - Google Analytics