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

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

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);//持久态对象可以自动更新数据库

最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

image

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

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

@Test

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

public void demo02() {

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

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

//获得持久态对象

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

最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

[外链图片转存中…(img-cmxMcm74-1714643796375)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 27
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值