对象的三种状态:
瞬时态:也叫临时态,与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());
}
}