实体类 User.java:
package com.hibernate.status;
import javax.persistence.*;
import java.util.Objects;
public class User {
private int id;
private String username;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
'}';
}
}
映射文件 User.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate.status">
<class name="User" >
<id name="id">
<generator class="native"/>
</id>
<property name="username"/>
</class>
</hibernate-mapping>
主配置文件 hibernate.cfg.xml:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/hib_demo</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
测试程序 Demo.java:
package com.hibernate.status;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
/**
* hibernate 中对象的状态:临时/瞬时状态、持久化状态、永久状态
* 1、临时状态:
* 特点:
* 直接 new 出来的对象;
* 不处于 session 的管理;
* 数据库中没有对象的记录;
* 2、持久化状态:
* 当调用 session 的 save/saveOrUpdate/get/load/list 等方法的时候,对象就是持久化状态;
* 处于持久化状态的对象,当对对象属性进行修改的时候,会反映到数据库中;
* 特点:
* 处于 session 的管理;
* 数据库中有对象的记录;
* 3、游离状态:
* 特点:
* 不处于 session 的管理;
* 数据库中有对应的记录;
* session 关闭后,对象的状态;
*/
public class StatusDemo {
private static SessionFactory sf;
static {
sf = new Configuration()
.configure()
.addClass(User.class) // 自动加载映射文件,测试时候使用
.buildSessionFactory();
}
/**
* 对象状态的转换
*/
@Test
public void testSave() {
Session session = sf.openSession();
Transaction transaction = session.beginTransaction();
// 创建对象:临时状态
User user = new User();
user.setUsername("Lucy");
// 保存:持久化状态
session.save(user);
// 调用过 save 方法以后,对象会变成持久化状态,修改对象的属性,
// 会改变数据库中的值(生成一条 update 语句)
user.setUsername("Jack333333");
// 提交事务,关闭 session
transaction.commit();
session.close();
// session 关闭以后,并且数据库中有对应的记录,对象会变成游离状态;
// 此时修改对象中的属性,不会对数据库中的数据造成影响;
user.setUsername("Jack444444444");
}
}