hibernate中对象的三种状态:瞬时态、脱管态、持久态

对象的三种状态:
     瞬时态:也叫临时态,与session没有关联,没有id,在数据库中没有记录
     脱管态:也叫游离态,与session没有关联,但在数据库中有对应的id,有这条记录
     持久态:与session有关联,且在数据库中有对应的id,有这条记录
     * 转换:
      1. 瞬时=>脱管
      2. 瞬时=>持久
      3. 脱管=>持久
      4. 脱管=>瞬时
      5. 持久=>脱管
      6. 持久=>瞬时
     * 三种状态有什么用?
       持久状态,我们使用Hibernate主要是为了持久化我们的数据
       对于对象的状态,我们期望我们需要同步到数据库的数据,都被装化成持久状态
       持久化状态特点:Hibernate会自动将持久化状态对象的变化同步到数据库中

如下是转换的栗子:

TestState.java

package hibernate;

import hibernateUtils.hibernateUtils;
import org.hibernate.Session;
import org.junit.Test;

public class TestState {

	@Test
	//瞬时=>脱管 
	public void testOne() {
		Session session = hibernateUtils.getOpenSession();
		User user = new User();  //瞬时态
		user.setId(2); //脱管态
		user.setUsername("小黄鸭");
		//session.update(user); //持久态
		
		//持久=>脱管
		session.beginTransaction().commit(); //持久态,会自动执行update
		session.close(); //脱管态
	}
	
	@Test
	//瞬时=>持久
	public void testTwo() {
		Session session = hibernateUtils.getOpenSession();
		User user = new User();  //瞬时态
		user.setUsername("小红鸭"); //瞬时态
		user.setPassword("66666"); //瞬时态
		session.save(user); //持久态
		
		//持久=>脱管
		session.beginTransaction().commit(); //持久态
		session.close(); //脱管态
	}
	
	@Test
	//脱管=>持久 
	public void testThree() {
		Session session = hibernateUtils.getOpenSession();
		User user = new User(); 
		user.setId(3); //脱管态
		user.setUsername("小绿鸭");
		session.update(user); //持久态
		
		//持久=>脱管
		session.beginTransaction().commit(); //持久态,会自动执行update
		session.close(); //脱管态
	}
	
	@Test
	//持久=>脱管
	public void testFour() {
		Session session = hibernateUtils.getOpenSession();
		User user = (User)session.get(User.class,1);  //持久态
		session.evict(user);  //脱管态
		user.setUsername("小黑鸭"); 
		user.setPassword("yayayaya"); 
		session.save(user); //持久态
		
		//持久=>脱管
		session.beginTransaction().commit(); //持久态
		session.close(); //脱管态
	}
	@Test
	//脱管=>瞬时
	public void testFive() {
		Session session = hibernateUtils.getOpenSession();
		User user = (User)session.get(User.class,2);  //持久态
		session.evict(user);  //脱管态
		user.setId(null); //瞬时态
		user.setUsername("小白鸭"); 
		user.setPassword("66666"); 
		session.save(user); //持久态,新插入了一条数据
		
		//持久=>脱管
		session.beginTransaction().commit(); //持久态
		session.close(); //脱管态
	}
	@Test
	//持久=>瞬时
	public void testSix() {
		Session session = hibernateUtils.getOpenSession();
		User user = (User)session.get(User.class,2);  //持久态
		user.setId(null); 
		session.evict(user);  //瞬时态
		user.setUsername("小粉鸭"); 
		user.setPassword("66666"); 
		session.save(user); //持久态,新插入了一条数据
		
		//持久=>脱管
		session.beginTransaction().commit(); //持久态
		session.close(); //脱管态
	}
}

JavaBean也就是User.java

package hibernate;

public class User {
	private  String  username;
	private String password;
	private Integer id;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + ", id=" + id + "]";
	}
}

ORM也就是映射文件User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping package="hibernate"> 
 	<class name="hibernate.User" table="T_User"  >
        <id name="id"  column="id">
            <generator class="native" />
        </id>
        <property name="username"  column="username" length="20" />
        <property name="password" column="password" length="20" />
  </class>
 </hibernate-mapping>
 

hibernateUtils.java

package hibernateUtils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

public class hibernateUtils {
	
    private	static SessionFactory f;
    /*
     * 用静态代码块封装getSession的好处:静态代码块只加载一次
     * (这样就去除了多次new工厂对象和session,不用每次都运行内存里的东西(factory连接池)),
     * 并且static代码块无条件先执行
     */
    static{
    	Configuration con = new Configuration().configure();
    	f = con.buildSessionFactory();
    	//关闭资源,用线程来关闭session,线程由runnable的匿名内部类来调用线程
    	Runtime.getRuntime().addShutdownHook(new Thread(new Runnable(){
    		public void run(){
    			System.out.println("jvm虚拟机关闭了");
    			f.close();
    			}
    		}));
    }
    public static Session getOpenSession(){
    	Session session = f.openSession();  //每次打开一个新的session
    	return session;
    }
    public static Session getCurrentSession(){
    	Session session = f.getCurrentSession();  //每次打开一个新的session
    	return session;
    }
    public static void main(String[] args) {
		System.out.println(getCurrentSession());
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_37891342/article/details/85726132