Hibernate中持久化类与持久化对象
1、JavaBean类
JavaBean类是实体类,必须一下属性,private修饰的成员属性,public修饰的getter与setter访问方法,public修饰的空参构造器,实现Serializable接口。
2、持久化类的概念
持久化类就是建立了映射关系的JavaBean类,持久化类 = JavaBean类 + JavaBean类对应的映射配置文件。
编写持久化类时,有几点需要注意:
- private修饰的成员属性尽量使用基本数据类型对应的包装类,包装类型更合理,例如年龄不存在时,基本类型int默认值为0,而包装类型Integer默认值为null
- public修饰的空参构造器,底层需要进行反射
- 提供一个标识属性,映射表的主键字段
- 创建表时应尽量使用代理主键而不是自然主键
3、主键生成策略
- increment:Hibernate提供的一种自动增长机制,适用与short、int、long类型作为主键的字段,使用时需要先从数据库查询出主键最大值,再将最大值加1进行插入。
- identity:适用于short、int、long类型的主键,必须使用在有自动增长机制的数据库中,采用的是数据库底层的自动增长机制。如MySQL数据库的auto_increment。
- sequence:适用于short、int、long类型的主键,底层使用的是序列的增长方式。Oracle使用序列实现自动增长。
- uuid:使用与char、varchar类型的主键,使用随机的字符串最为主键
- native:本地策略,根据底层数据库类型的不同,自动选择适用于该数据库的主键生成策略(short、int、long)。如果底层是MySQL,相当于identity,如果是Oracle,相当于sequence。
- assigned:不适用hibernate维护主键,必须手动设置主键。
4、持久化对象的状态
Hibernate为了管理持久化类,将持久化对象分为三个状态。
- 瞬时态:Transient Object,没有持久化标识OID,没有被Session对象管理
- 持久态:Persistent Object,有持久化标识OID,被Session对象管理
- 托管态:Detached Object,有持久化标识OID,没有被Session对象管理
5、持久化对象之间的转换
以实体类User为例,User user = new User();
- 瞬时态-->持久态:save()/saveOrUpdate()
- 瞬时态-->托管态:user.setId(1);
- 持久态-->瞬时态:delete()
- 持久态-->托管态:调用evict()/close()/clear()
- 托管态-->持久态:upodate()/saveOrUpdate()/lock()
- 托管态-->瞬时态:user.setId(null)
6、hibernate开发环境搭建、编写映射配置文件、编写核心配置文件、编写代码实现数据库交互演示
Person类(JavaBean类,主键String类型演示主键生成策略uuid用)
package com.alphajuns.domain; public class Person { private String pid;
private String pname; public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
@Override
public String toString() {
return "Person [pid=" + pid + ", pname=" + pname + "]";
} }
Person类映射配置文件Person.hbm.xml(配置文件位于实体包下,命名为实体类类名.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>
<!-- 配置JavaBean类与表的映射 -->
<class name="com.alphajuns.domain.Person" table="person">
<!-- 配置id -->
<id name="pid" column="pid">
<!-- 主键生成策略 -->
<generator class="uuid"></generator>
</id> <!-- 其他配置项 -->
<property name="pname" column="pname"></property> </class>
</hibernate-mapping>
User类(JavaBean类,演示开发环境搭建,代码编写步骤用,测试用)
package com.alphajuns.domain; public class User { private Integer id;
private String name;
private Integer age; public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
} }
User类映射配置文件
<?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>
<!-- 配置类和表结构的映射 name:全包名 table:表名 -->
<class name="com.alphajuns.domain.User" table="user"> <!-- 配置id name:JavaBean中的属性 column:数据库表的主键 -->
<id name="id" column="id">
<!-- 主键生成策略 native代表本地的,会根据数据库自动选择 -->
<generator class="native"></generator>
</id> <!-- 配置其他属性 -->
<property name="name" column="name"></property>
<property name="age" column="age"></property> </class> </hibernate-mapping>
核心配置文件(位于src下)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<!-- 先配置SessionFactory,一个数据库对应一个SessionFactory -->
<session-factory>
<!-- 必须配置项:5个,包括数据库驱动、url、用户名、密码、数据库的方言 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day02</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 数据库的方言,指明为某种数据库所特有 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 可选配置项 -->
<!-- 在控制台显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 生成数据库的表结构 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 开启绑定本地的session -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 设置数据库的隔离级别,就使用默认值就OK
<property name="hibernate.connection.isolation">4</property>
--> <!-- 引入映射配置文件 update:没有表时,创建表,表存在时,更新表 -->
<mapping resource="com/alphajuns/domain/User.hbm.xml" />
<mapping resource="com/alphajuns/domain/Person.hbm.xml" /> </session-factory>
</hibernate-configuration>
HibernateUtisl工具类
package com.alphajuns.utils; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; /*
* Hibernate工具类
*/
public class HibernateUtils { private static final Configuration CONFIG;
private static final SessionFactory FACTORY; // 静态代码块
static {
// 加载配置文件
CONFIG = new Configuration().configure();
// 创建SessionFactory对象
FACTORY = CONFIG.buildSessionFactory();
} // 由SessionFactory对象创建Session对象
public static Session getSession() {
return FACTORY.openSession();
} // 从ThreadLocal中获得Session
public static Session getCurrentSession() {
return FACTORY.getCurrentSession();
} }
测试代码
package com.alphajuns.test; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; import com.alphajuns.domain.Person;
import com.alphajuns.domain.User;
import com.alphajuns.utils.HibernateUtils; public class Demo1 { @Test
public void run4() {
// 创建Session对象
Session session = HibernateUtils.getSession();
// 开启事务
Transaction tr = session.beginTransaction();
User user = new User();
user.setName("小华");
user.setAge(24);
// 此时user是瞬时态,没有oid,没有被session对象管理 // 保存操作
session.save(user);
// 此时user是持久态,有oid,被session对象管理 // 提交事务
tr.commit();
// 释放资源
session.close();
// session对象销毁,此时user是托管态,有oid,没有被session管理
} @Test
public void run3() {
// 创建Session对象
Session session = HibernateUtils.getSession();
// 开启事务
Transaction tr = session.beginTransaction();
// 操作数据
Person p = new Person();
p.setPname("小明");
// 保存操作
session.save(p);
// 提交事务
tr.commit();
// 关闭资源
session.close();
} @Test
public void run2() {
// 创建Session对象
Session session = HibernateUtils.getSession();
// 开启事务
Transaction tr = session.beginTransaction();
// 操作数据
User user = new User();
user.setName("韩梅梅");
user.setAge(20);
// 保存操作
session.save(user);
// 提交事务
tr.commit();
// 关闭资源
session.close();
} @Test
public void run1() {
// 1、加载配置文件
Configuration config = new Configuration();
config.configure();
// 2、创建SessionFactory对象
SessionFactory factory = config.buildSessionFactory();
// 3、由SessionFactory对象创建Session对象
Session session = factory.openSession();
// 4、开启事务
Transaction tr = session.beginTransaction();
// 5、编写操作db代码
User user = new User();
user.setName("李雷");
user.setAge(18);
// 保存对象
session.save(user);
// 6、提交事务
tr.commit();
// 7、释放资源
session.close();
factory.close();
} }
Hibernate中持久化类与持久化对象的更多相关文章
- BX2001: IE 支持使用 window.clipboardData 访问系统剪贴板,Chrome 和 Safari 中存在类似的 Clipboard 对象但尚未实现,Firefox 和 Opera 不支持这类对象
http://www.w3help.org/zh-cn/causes/BX2001 标准参考 无 问题描述 IE 支持使用 window.clipboardData 对象内的一系列方法访问系统剪贴板: ...
- hibernate中java类的成员变量类型如何映射到SQL中的数据类型变化
hibernate映射文件??.hbm.xml配置映射元素详解--Hibernate映射类型 在从Hibernate的java的成员类型映射到SQL中的数据类型,其内映射方式它满足,SQL可以自己调制 ...
- Hibernate中的实体规则、对象状态和进阶-一级缓存
一.hibernate中的实体规则 1.实体类创建的注意事项 2.主键类型 3.主键生成策略 (1)代理主键 (2)自然主键 二.hibernate中的对象状态 1.对象分为三种状态 2.三种状态的转 ...
- python中利用类创建的对象来保存信息
在类创建的对象中,一般都是以字典的方式来保存信息 class Student: def __init__(self, name, age, score): self.name = name self. ...
- hibernate中Configuration类的作用
问题:我们在获得一个SessionFactory对象的时候经常是写下面这行代码: SessionFactory sessionFactory = new Configuration().configu ...
- Hibernate中的持久化类
一.持久化类概述 就是一个JavaBean,这个JavaBean与表建立了映射关系.这个类就称为是持久化类. 简单理解为 持久化类=JavaBean+映射文件. 持久化类:是指其实例需要被Hibern ...
- (补充)06.Hibernate持久化类&持久化对象
持久化类:就是一个Java类(JavaBean),这个类与表建立映射关系就可以成为是持久类 持久化类 = JavaBean + xxx.hbm.xml 编写规则: 1.提供一个无参数,public访问 ...
- java框架之Hibernate(2)-持久化类&主键生成策略&缓存&事务&查询
持久化类 概述 持久化:将内存中的对象持久化到数据库中的过程就是持久化.Hibernate 就是用来进行持久化的框架. 持久化类:一个 Java 对象与数据库的表建立了映射关系,那么这个类在 Hibe ...
- hibernate的持久化类、主键生成策略
一.hibernate的持久化类 1.什么是持久化类: 持久化:将数据存储到关系型数据库. 持久化类:与数据库中的数据表建立了某种关系的java类.(持久化类=javabean+映射配置文件) 2.持 ...
随机推荐
- 【Linux】监控系统的状态
1.w命令 w命令是一个很强大的命令,该命令显示的信息比较丰富.以下是我的虚拟机w命令的一个展示 从上图我们可以看到: 第一行从左面开始显示的信息依次为:时间.系统运行时间.登陆用户数.平均负载 第二 ...
- jquery.validate.js 验证框架详解
项目中遇到这个js框架 jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 ...
- asp.net,cookie,写cookie,取cookie(转载)
Cookie是一段文本信息,在客户端存储 Cookie 是 ASP.NET 的会话状态将请求与会话关联的方法之一.Cookie 也可以直接用于在请求之间保持数据,但数据随后将存储在客户端并随每个请求一 ...
- unity, access standard shared emission by script
unity 5.1.1f1 personal 用下面方法在脚本中设置standard shader的emssion: gameObject.GetComponent<MeshRenderer&g ...
- Resources.FindObjectsOfTypeAll<T>()的坑(Ghost prefab)
今天遇到了一个Bug,因为调用Resources.FindObjectsOfTypeAll<T>()遍历整个场景,结果遍历出的对象不对.比较哈希一查果然是两个.原来prefab本身和pre ...
- Atitit.执行cmd 命令行 php
Atitit.执行cmd 命令行 php 1. 执行cmd 命令行,调用系统命令的基础 1 1.1. 实际执行模式 1 1.2. 空格的问题 1 1.3. 中文路径的问题,程序文件读取编码设置 1 1 ...
- 最全面的 Sublime Text 使用指南
最全面的 Sublime Text 使用指南 摘要(Abstract) 本文系统全面的介绍了Sublime Text,旨在成为最优秀的Sublime Text中文教程. 前言(Prologue) ...
- 蓝牙(CoreBluetooth)-外部设备(服务端)
蓝牙(CoreBluetooth)-外部设备(服务端) 主要内容 1. 创建外部管理器对象 2. 设置本地外设的服务和特征 3. 添加服务和特征到到你的设置的数据库中 4. 向外公布你的的服务 5. ...
- Hadoop 2.0 编译问题小结
原文见 http://xiguada.org/hadoop-2-x-compile/ 这些问题是2013年初整理的,不过到目前为止,即使最新的hadoop2.0系列,编译总体上变化不大,因此还能适用. ...
- mysql之slave_skip_errors选项
要说slave_skip_errors选项,就不得不提mysql的replication机制,总的来说它分了三步来实现mysql主从库的同步 master将改变记录到二进制日志(binary log) ...