Hibernate持久化类的理解

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

Hibernate持久化类的理解

对于映射(mapping),有两套API,一个是Hibernate Session,另一个是Java Persistence EntityManager。后者是Java持久化的标准,因此,允许改变持久化实现而不会出现问题,很多实现都是参考了这个标准的。这里讲的是Hibernate Session。

1 持久化类的三个状态

Using Hibernate is different from using SQL. If you call session.save(customerObject) then there is no insert into customer… query into the database. Hibernate will set the id property (if the id is generated) and bind the entity to a persistence context. The persistence context is synchronized with the database when transaction.commit() is called.

三个状态的关系及可以使用的操作

由图可知,
- 1 新建的对象,处于transient,其还没有主键(如果主键自动生成的话),与数据库无半毛钱关系。
- 2 当session.save()之后,处于persistent状态,hibernate会设置主键,并将其与persistent context(A persistence context handles a set of entities which hold data to be persisted in some persistence store (e.g. a database),你可以把它看作缓存。)绑定。此时,对对象所做的修改,会reflect到cache(in-memory)中。因此,此时在database中也看不到插入的数据。只有tx.commit()(事务结束)之后,才会插入到database中。我试验过,确实这样,不commit,在数据库中是看不到的。
- 3 在session.close()之后,对象就处于detached状态。对其所做的修改,不会reflect到cache中。当其通过session.update() 或者 session.lock()操作之后,就可以将其转化为persistent状态。

2 CRUD操作

CRUD操作几乎是工作中最常见的操作,这里也学习一下。

mysql数据库

create database podemo;
create table car (
    car_id int(11) not null auto_increment primary key,
    brand varchar(20),
    type varchar(20),
    price int(255)
)ENGINE=InnoDB;

PO类

package com.chris.po;

@Entity
@Table(name="car")
public class Car {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY )
    @Column(name="car_id")
    private Integer id;
    private String brand;
    private String type;
    //单位为分,不是元
    private int price;

    public int getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }


}
  • insert
    新建对象,调用setter方法,然后session.save()tx.commit()
Transaction tx = session.beginTransaction();
        Car car = new Car();
        car.setBrand("Audi");
        car.setType("ranger");
        car.setPrice(30000000);
        session.save(car);
        tx.commit();
  • update
    要想update一个已经存在于数据库中的对象,必须先将其加载为持久化对象,可以通过session.get()或者session.load()方法。
        Transaction tx = session.beginTransaction();        
        Car car = (Car) session.get(Car.class, 1);
        car.setBrand("BMW");
        tx.commit();
  • delete
    对于可以删除持久化态的对象,也可以删除detached状态的对象。(注意:对于JPA来说,必须先转化为persistent状态,才能删除。)
    如果两个实体之间存在外键约束,可以设置级联(cascading)删除。
        Session session = sf.openSession();
        Transaction tx = session.beginTransaction();
        Car car = new Car();
        car.setBrand("Buick");
        car.setType("ranger");
        car.setPrice(20000000);
        session.save(car);
        tx.commit();
        session.close();

        Session sess2 = sf.openSession();
        Transaction tx2 = sess2.beginTransaction();
        sess2.delete(car);      
        tx2.commit();
        sess2.close();

3 getCurrentSession()和openSession()

current_session_context_class

使用sessionFactory.getCurrentSession()默认会将session绑定到当前上下文(current context),默认的context是线程(thread,局部事务)。换句话说,调用openSession()的线程会和这个打开的session绑定。current_session_context_class除了thread这个选项,还可以和jta绑定(全局事务)或者自己实现org.hibernate.context.CurrentSessionContext(不常用)。

openSession()

这个方法每次调用都会返回一个新的Session对象,是org.hiberante.impl.SessionImpl的实例。
- 这个方法不会自动的flush()close()打开的session,因此需要我们自己进行。

getCurrentSession()

获取current session,默认与thread绑定。当getCurrentSession()方法被调用时,打开一个session,如果已经存在了session,则利用这个已经存在的session对象;当事务结束时,关闭session。通过这个方法打开的session会自动flush()close()

在Web应用中,一般是一个请求对应一个thread,故如果将current_session_context_class设置为thread,使用sessionFactory.getCurrentSession(),则不同的请求会有不同的session。

4 如有错误,还请指出,共同进步

5 参考

保姆级教程:用中移ML307模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码 本文详细介绍了如何使用中移ML307系列模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码的全过程。涵盖高德定位服务和OneOS定位服务的配置步骤、常见错误处理及性能优化技巧,帮助开发者快速实现基站定位功能,提升物联网项目的定位精度和稳定性。 阅读详情

相关推荐

三极管、MOS管和晶体管综合对比——《器件手册--三极管、MOS管和晶体管》

IGBT(Insulated Gate Bipolar Transistor,绝缘栅双极型晶体管)是一种复合全控型电压驱动式功率半导体器件,结合了MOSFET的高输入阻抗、开关速度快的优点和双极型晶体管(BJT)的低导通压降、高电流密度的优点。例如,在NPN型三极管中,当基极电流增加时,集电极电流会按照一定的比例(放大倍数β)增加,这个比例通常在几十到几百之间。在NMOS管中,当栅极相对于源极的电压(Vgs)小于开启电压(Vth)时,漏极和源极之间没有导电沟道,电流无法通过,处于截止状态。

XU157303764的博客 2832

Hibernate|Hibernate5.4用户指南(五)之持久化上下文-Persistence Context

Hibernate用户手册(五)之持久化上下文

白衬衫猿 1368

使用SSC添加大量的SDO条目

使用SSC添加大量的SDO条目 SSC用表格添加SDO,PDO部分必须指定到0x1600和0x1A00分配TxPdo和RxPdo映射,在0x1C12和0x1C13分别分配到SM2和SM3。在0x6000和0x7000未指定的entry就是SDO部分。

PI_sunyang的博客 3121

Hibernate chapter 3.Persistence Contexts

内容列表 org.hibernate.Session API和

luccs624061082的专栏 616

Hibernate与JPA持久化上下文(Persistence context)生命周期比较

Hibernate和Jpa中都有持久化上下文的概念(Persistence context),持久化上下文其实就是Hibernate和JPA的一级缓存,通过在持久化上下文中存储持久化状态实体的快照,既可以进行脏检测,并且持久化上下文还可以当做持久化实体的缓存。下面比较一下Hibernate和JPA中持久化上下文的不同。 1.Hibernate是将Persistence contex...

tongmin的专栏 299

org.hibernate.persister.entity.SingleTableEntityPersister错误的另一个原因

问题:项目启动报 【Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister】错误今天签出一个项目时出现如上截图中所描述的问题,度娘了一下,说是映射问题,get、set方法的书写问题。但其他同事同一个项目无此错误。应该是项目的配置有问题,检查了lib以及context环境,都没有问...

marine008的专栏 887

Spring Data JPA 的一个坑 没有默认将sql保留关键字使用``进行屏蔽

Spring Data JPA 的一个坑 没有默认将sql保留关键字使用``进行屏蔽 like 问题出现的经过 我的实体如下: @Entity @DynamicUpdate @Data @Builder @NoArgsConstructor @AllArgsConstructor public class ItemUserLike { @Id @GeneratedValue(st...

晨猫 3170

初识Hibernate理解持久化

上一篇文章我们简单介绍了Hibernate相关的一些最基本的文件及其作用,并在最后完整的搭建了Hibernate的运行环境,成功的完成了与数据库的映射。但是至于其中的一些更加细节的地方并没有很详尽的解释,本篇则主要介绍Hibernate中的一个关键元素,持久化。主要涉及以下一些内容: 定义用作持久化的基本要求 持久化对象的几种不同状态及其相互之间的转换 使用Hibernate完成对数据库的cru

Walker_YAM 393

我对hibernate中oid和持久化的三种状态的理解

oid是持久化中的一个属性,与数据库中的id属性对应,如cust_id。 因为hibernate底层是通过持久化的反射方法操作的,所以持久化中的每一个属性都应该有set和get方法,oid也不例外。但是我们不应该直接使用oid的set和get方法,而应该由数据库生成后返回给持久化对象。 持久化对象是否有oid,是该对象是瞬时态还是持久态的标志。 当我们new一个custmer对象...

weixin_33825683的博客 145

hibernate持久化及主键生成策略

Hibernate持久化: 1、什么是持久化持久化:将内存中的一个对象持久化到数据库中,hibernate就是用来持久化的框架; 持久化:一个java文件和数据库表建立了映射关系,那么这个hibernate中就称为持久化。简单的说持久化=Java+映射文件; 2、持久化的编写规则: 对持久化提供一个无参数的构造函数;(hibernate需要通过反射来生成对象的实...

woaixuexiwoshixueba的博客 188

Hibernate学习——持久化的学习

A.概念   持久化:将内存中的对象持久化(存储)到数据库的过程。Hibernate就是持久化的框架。   持久化:一个普通java对象与数据库的表建立了映射关系,那么这个在Hiberna中被称为持久化。(通俗一点就是java+映射文件) B.持久化的编写规则   1.持久化提供一个无参构造方法。     当然,如果你什么构造都不写,默认还是有无参的。提供无参构造是为...

weixin_30613727的博客 150

Hibernate持久化概述

什么是持久化 持久化:将内存中的一个对象持久化到数据库中的过程。 持久化Hibernate是一个ORM框架,因此当一个Java对象与数据库的表建立了映射关系时,那么在这个Hibernate中称为是持久化,即:持久化=Java+映射文件 持久化的编写规则 对持久化提供一个无参数的构造方法:Hibernate底层需要使用反射生成对象实例; 属性私有,对私有属性提供public...

Keeping Ready, Keeping Coding 324

hibernate持久化&持久化对象(五)

一、Hibernate持久化 1.1 什么是持久化 持久化:就是一个Java(程序员编写的JavaBean),这个Java与表建立了映射关系就可以成为是持久化持久化 = JavaBean + xxx.hbm.xml 1.2 持久化的编写规则 1. 提供一个无参数 public访问控制符的构造器 -- 底层需要进行反射. 2. 提供一个标识属性,映射数据表主键字段-

csdn_kenneth的博客 597

Hibernate持久化要遵循的四条主要原则

1、实现一个默认的(即无参数的)构造方法(constructor) 所有的持久化都必须有一个 默认的构造方法(可以不是public的),这样的话Hibernate就可以使用 Constructor.newInstance()来实例化它们。 强烈建议,在Hibernate中,为了运行期代理的生成,构造方法至少是 包(package)内可见的。

Mr_Tank_ 1159

Hibernate持久化持久化对象状态和缓存机制

一,持久化     1,含义:一个Java和数据库表建立了映射关系,那么这个就是持久化。     2,书写规范:             a,具有无参构造方法。因为Hibernate底层需要使用反射机制生成的实例。             b,具有私有属性,并对私有属性提供getter和setter方法。因为Hibernate底层会将查询到的数据进行封装。           ...

小白的逆袭的博客 391

Hibernate持久化对象

Hibernate是一个纯粹的O/RMapping框架,通过Hibernate的支持,程序开发者只需要管理对象的状态,无须理会底层数据库系统的细节。相当于常见的JDBC持久层方案中需要手工管理SQL语句,Hibernate采用完全面向对象的方式来操作数据库。对于程序开发者而言,眼里只有对象、属性,无须理会底层数据表、数据列等概念。 1. 持久化的要求 虽然Hibernate对持久滑太远的要

owen_william的博客 787

hibernate持久化的编写规则

持久化的概述 什么是持久化 持久化:将内存中的一个对象持久化到数据库中的过程。hibernate框架就是用来进行持久化的框架。 持久化:一个Java对象与数据库的表建立映射关系,那么这个hibernate中就可以称之为持久化持久化 = Java + 映射文件 持久化的编写规则 持久化的编写规则 对持久化...

lby0608的博客 566

hibernate笔记--持久化的三种状态

持久化的三种状态 hibernate持久化框架,通过持久化完成ORM操作。hibernate为了更好的管理持久化,将持久化分成三种状态。 持久化=Java+映射 瞬时态(transient) 这种对象没有唯一标识符OID,还没有被session管理,这种对象被称之为瞬时态对象。 持久态(persistent) 这种对象有唯一标识符OID,被sessi...

lby0608的博客 234

Hibernate 映射文件详解

Hibernate持久化和关系数据库之间的映射通常是用一个XML文档来定义的。该文档通过一系列XML元素的配置,来将持久化与数据库表之间建立起一一映射。这意味着映射文档是按照持久化的定义来创建的,而不是表的定义。 一、根元素:,每一个hbm.xml文件都有唯一的一个根元素,包含一些可选的属性 1)package:指定一个包前缀,如果在映射文档中没有指定全限定的名,就使用这个作

xiaotan_long的专栏 453

Hibernate之深入持久化对象

Hibernate是一个彻底的O/R Mapping 框架。之所以说彻底,是因为相对于其他的 框架 ,如Spring JDBC,iBatis 需要手动的管理SQL语句,Hibernate采用了完全 面向对象的方式来操作数据库。 但是当开发者需要深入的了解Hibernate底层运行时,对Hibernate的数据访问进行优化时,就需要了解Hibernate的底层SQL操作了。由于对于绝大部分的应用...

weixin_34245082的博客 77
上一篇: 表单提交时,前端用js加密,后端用Java(struts2)解密
下一篇: 整合Spring IoC与MyBatis
CupOnDesk
博客等级 码龄11年 1粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值