先来看看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返回的对象。