Hibernate持久化类编写的规则,主键生成策略,持久化类的三种状态,Hibernate持久化类的三种状态转换,Hibernate持久态对象特性

c、一旦自然主键参与到业务逻辑当中。后期就有可能修改源代码。(好的程序的设计要满足OCP原则:对程序的一个扩展是open的。对修改原码是close的)

2、Hibernate的主键生成策略

在实际开发中一般是不允许用户手动设置主键,一般会将主键数据库,手动编写程序进行设置。

在hibernate当中为了减少程序的编写,提供了很多的主键生成的策略。

Aincrement:hibernate中提供的一个自动增长的一个机制。(mysql当中不会选自动增长,使用的Hibernate当中的)适用于short,int,long类型的主键。

在单线程的程序当中使用

a、首先发送一条语句,select max(id) from 查到表id:然后让id+1作为下一条记录的一个记录的主键。

Bidentity:适用于short、int、long类型的主键,使用的是数据库底层的自动增长的机制。适用于有自动增长机制的数据库(MySQL,MSSQL)但是Oracle没有找到增长机制的。

Csequnence:序列 适用于short、int、long类型的主键,采用的是序列的方式。(Oracle支持序列)。MySQL就不能使用sequnence

D : uuid:适用于字符串主键。使用Hibernate当中一种随机方式生成字符串类型的主键

Enative:本地策略,可以在identity和sequnence之间来进行自动切换

Fassigned:Hibernate会放弃外键的管理,需要通过自己手动编写程序或者用户自己进行设置。

Gforeign:外部的。一对一的一种关联映射的情况下使用。(例如两个表的主键是一一对应的)

3、上述主键生成策略的案例

Aincrement:

在映射文件当中修改对应的生成键策略对应的class

在这里插入图片描述

public class HibernateUtils {

public static final Configuration cfg;

public static final SessionFactory sf;

static {

cfg = new Configuration().configure();

sf = cfg.buildSessionFactory();

}

public static Session openSession() {

return sf.openSession();

}

}

public class HibernateDemo1 {

@Test

// 保存一条记录

//演示increment

public void demo01() {

Session session = HibernateUtils.openSession();

Transaction transaction = session.beginTransaction();

Customer customer = new Customer();

customer.setCust_name(“王细”);

session.save(customer);

transaction.commit();

session.close();

}

@Test

// 保存一条记录

//演示increment

public void demo02() {

Session session = HibernateUtils.openSession();

Transaction transaction = session.beginTransaction();

Customer customer = new Customer();

customer.setCust_name(“王被”);

session.save(customer);

transaction.commit();

session.close();

}

}

1、使用Debug模式分别调试两个方法,分别在不同的线程当中调试

当第一个方法执行时

会先查询表当中的id的值,然后加1

将对应的属性的值放入到加1的id对应的表的项内

此时将数据插入到对应的表当中后,不提交事务

2、开始用第二个方法

会先查询表当中的id的值,然后加1

将对应的属性的值放入到加1的id对应的表的项内

对应相同的id上插入对应的数据,然后会报错

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Bidentity:

在映射文件当中修改对应的生成键策略对应的class

在这里插入图片描述

@Test

// 保存一条记录

//演示identity

public void demo03() {

Session session = HibernateUtils.openSession();

Transaction transaction = session.beginTransaction();

Customer customer = new Customer();

customer.setCust_name(“王被”);

session.save(customer);

transaction.commit();

session.close();

}

使用数据库的自动增长机制

在这里插入图片描述

D : uuid:

将Customer的id改为String类型的

在这里插入图片描述

在映射文件当中修改对应的生成键策略对应的class

在这里插入图片描述

@Test

// 保存一条记录

//演示uuid

public void demo04() {

Session session = HibernateUtils.openSession();

Transaction transaction = session.beginTransaction();

Customer customer = new Customer();

customer.setCust_name(“王被”);

session.save(customer);

transaction.commit();

session.close();

}

在这里插入图片描述

在这里插入图片描述

Fassigned:

在映射文件当中修改对应的生成键策略对应的class

在这里插入图片描述

直接执行会报错,因为,没有设置主键的值,需要手动设置

在这里插入图片描述

在这里插入图片描述

@Test

// 保存一条记录

//演示assigned

public void demo05() {

Session session = HibernateUtils.openSession();

Transaction transaction = session.beginTransaction();

Customer customer = new Customer();

customer.setCust_id(4556L);

customer.setCust_name(“王被”);

session.save(customer);

transaction.commit();

session.close();

}

在这里插入图片描述

一般用native和identity的比较多(int Long 的主键)

映射文件当中

在这里插入图片描述

在这里插入图片描述

四、持久化类的三种状态


Hibernate是持久层的一个框架,通过持久化类完成ORM操作。Hibernate为了更好的管理持久化类,就将持久化类分为三种状态。

持久化类=Java类+映射

1、瞬时态:没有持久化标识OID,没有被纳入Session对象的管理

这种对象没有唯一的标识OID,没有被session所管理。

2、持久态:有持久化标识OID,已经被纳入Session对象的管理

这种对象有唯一的标识OID,被session所管理,这种对象就是持久态的对象。

持久化类的持久态对象。可以自动更新数据库

3、托管态:有持久化标识OID,但没有被Session对象管理

这种对象有唯一标识的OID,没有被session管理,这个就称为托管态的对象。

区分这三种状态的对象

在这里插入图片描述

五、Hibernate持久化类的三种状态转换


三种状态转换图

在这里插入图片描述

1:瞬时态的对象

A :获得瞬时态对象

获得:将与表建立好映射的类,new创建该类的对象,就创建了session的瞬时太对象

在这里为

Customer customer = new Customer();

B:状态转换

瞬时态,可以转换成为持久态(瞬时态->持久态)

save(Object obj);//通过save方法将瞬时态转换成为持久态

saveOrUpdate(Object obj);

瞬时太,可以转换成为托管态(瞬时太->托管态)

customer.setCust_id(1);//对象设置了id

2:持久态的对象

A :获得持久态对象

get(Object.class,id);

Customer customer = session.get(Customer.class,1L);//直接获得持久态对象

load(Object.class,id);

Customer customer = session.load(Customer.class, 2l);

find(Object.class,id);

Customer customer = session.find(Customer.class, 2l);

iterate(Object.class,id);

Customer customer = session.iterate(Customer.class, 2l);

B:状态转换

持久态,可以转换成为瞬时态(持久态->瞬时态)

delete();、

session.delete(Object obj);

持久态,可以转换成为托管态(持久态->托管态)

close();

session.close();

clear();

session.clear();

evict(Object obj);

session.evict();

3:托管态的对象

A :获得托管态对象

Customer customer = new Customer();

customer.setCust_id(1L);

B:状态转换

托管态,可以转换成为持久态(托管态->持久态)

update(Object obj);

session.update(Object obj);

saveOrUpdate(Object obj);

session.saveOrUpdate(Object obj);

在这里插入图片描述

托管态,可以转换成为瞬时态(托管态->瞬时态)

Customer customer = new Customer();

customer.setCust_id(null);

六、Hibernate持久态对象特性


1、持久化类的持久态对象自动更新数据库

@Test

// 持久态对象可以自动更新数据库----》依赖了Hibernate里面的一级缓存

public void demo02() {

Session session = HibernateUtils.openSession();// 链接数据库开启session域

Transaction transaction = session.beginTransaction();// 开启事务

//获得持久态对象

Customer customer = session.get(Customer.class, 1l);//持久态对象可以自动更新数据库

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-CCE6HmWV-1715690691495)]

[外链图片转存中…(img-22wUcG4i-1715690691495)]

[外链图片转存中…(img-kjlG22PD-1715690691496)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值