Hibernate学习笔记(九):hibernate 中对象的状态

实体类 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");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值