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中持久化类与持久化对象的更多相关文章

  1. BX2001: IE 支持使用 window.clipboardData 访问系统剪贴板,Chrome 和 Safari 中存在类似的 Clipboard 对象但尚未实现,Firefox 和 Opera 不支持这类对象

    http://www.w3help.org/zh-cn/causes/BX2001 标准参考 无 问题描述 IE 支持使用 window.clipboardData 对象内的一系列方法访问系统剪贴板: ...

  2. hibernate中java类的成员变量类型如何映射到SQL中的数据类型变化

    hibernate映射文件??.hbm.xml配置映射元素详解--Hibernate映射类型 在从Hibernate的java的成员类型映射到SQL中的数据类型,其内映射方式它满足,SQL可以自己调制 ...

  3. Hibernate中的实体规则、对象状态和进阶-一级缓存

    一.hibernate中的实体规则 1.实体类创建的注意事项 2.主键类型 3.主键生成策略 (1)代理主键 (2)自然主键 二.hibernate中的对象状态 1.对象分为三种状态 2.三种状态的转 ...

  4. python中利用类创建的对象来保存信息

    在类创建的对象中,一般都是以字典的方式来保存信息 class Student: def __init__(self, name, age, score): self.name = name self. ...

  5. hibernate中Configuration类的作用

    问题:我们在获得一个SessionFactory对象的时候经常是写下面这行代码: SessionFactory sessionFactory = new Configuration().configu ...

  6. Hibernate中的持久化类

    一.持久化类概述 就是一个JavaBean,这个JavaBean与表建立了映射关系.这个类就称为是持久化类. 简单理解为 持久化类=JavaBean+映射文件. 持久化类:是指其实例需要被Hibern ...

  7. (补充)06.Hibernate持久化类&持久化对象

    持久化类:就是一个Java类(JavaBean),这个类与表建立映射关系就可以成为是持久类 持久化类 = JavaBean + xxx.hbm.xml 编写规则: 1.提供一个无参数,public访问 ...

  8. java框架之Hibernate(2)-持久化类&主键生成策略&缓存&事务&查询

    持久化类 概述 持久化:将内存中的对象持久化到数据库中的过程就是持久化.Hibernate 就是用来进行持久化的框架. 持久化类:一个 Java 对象与数据库的表建立了映射关系,那么这个类在 Hibe ...

  9. hibernate的持久化类、主键生成策略

    一.hibernate的持久化类 1.什么是持久化类: 持久化:将数据存储到关系型数据库. 持久化类:与数据库中的数据表建立了某种关系的java类.(持久化类=javabean+映射配置文件) 2.持 ...

随机推荐

  1. C++ 代码风格准则:POD

    作者:一根筋的傻瓜链接:https://www.zhihu.com/question/36379130/answer/69853366来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  2. Tomcat 监控的几种方法

    Tomcat 监控方法 方法1:.使用tomcat自带的status页 具体方法: 步骤1:修改%tomcat安装路径%\conf \tomcat-users文件,配置admin设置权限.在<t ...

  3. 让网页自动调用双核浏览器的极速模式(<meta name="renderer" content="webkit">)

    背景:最近做了一个网站,传单服务器之后,每次打开都是乱码,不对啊,我在本地测得明明是排版很整齐啊,然后发现,360用的是“兼容模式”打开的,这就尴尬了,用户一打开就是乱码,这用户体验得有多差!用户可不 ...

  4. php中对象是引用类型吗?

    这貌似是一个极其简单的问题,还用得着专门写一篇博文?各位看官,最初我也这么认为,但这的确蒙蔽了你那水灵灵的小眼睛,不妨看看什么是引用? $a = 10; $b = &$a; $b = 20; ...

  5. 最实用、最常用的jQuery代码片段

    // chinacoder.cn JavaScript Document $(document).ready(function() { //.filter(":not(:has(.selec ...

  6. 在云服务器上部署node.js服务器

    本文档介绍腾讯云·万象优图服务端nodejs的部署和集成,搭建一个nodejs+nginx为基础,对web端或者移动端提供http签名接口服务的例子程序.注意:本文档只是简单的示例,展示了服务端为终端 ...

  7. 删除Git记录里的大文件

    删除Git记录里的大文件 仓库自身的增长 大多数版本控制系统存储的是一组初始文件,以及每个文件随着时间的演进而逐步积累起来的差异:而 Git 则会把文件的每一个差异化版本都记录在案.这意味着,即使你只 ...

  8. 简单记录一次ORA-00600 kcratr_nab_less_than_odr

    当前具体报错已经没有了,仅仅有对应图.參考EYGLE一篇文章中数据: 1.故障现象 数据库版本号11G,错误类似下面: ORA-00600: 内部错误代码, 參数: [kcratr_nab_less_ ...

  9. atitit.js的 字符串内容 转义  js处理html

    atitit.js的 字符串内容 转义  js处理html 1. js处理html的问题 1 2. js的 字符串内容 转义 1 2.1. 处理流程 1 3. 下面的表格列出了其余的特殊字符,这些特殊 ...

  10. SMP

    SMP(Symmetrical Multi-Processing):对称多处理技术,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构. 在smp系统中,所有的CP ...