`
Wind_ZhongGang
  • 浏览: 259696 次
  • 性别: 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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics