c、一旦自然主键参与到业务逻辑当中。后期就有可能修改源代码。(好的程序的设计要满足OCP原则:对程序的一个扩展是open的。对修改原码是close的)
2、Hibernate的主键生成策略
在实际开发中一般是不允许用户手动设置主键,一般会将主键数据库,手动编写程序进行设置。
在hibernate当中为了减少程序的编写,提供了很多的主键生成的策略。
A、increment:hibernate中提供的一个自动增长的一个机制。(mysql当中不会选自动增长,使用的Hibernate当中的)适用于short,int,long类型的主键。
在单线程的程序当中使用
a、首先发送一条语句,select max(id) from 查到表id:然后让id+1作为下一条记录的一个记录的主键。
B:identity:适用于short、int、long类型的主键,使用的是数据库底层的自动增长的机制。适用于有自动增长机制的数据库(MySQL,MSSQL)但是Oracle没有找到增长机制的。
C:sequnence:序列 适用于short、int、long类型的主键,采用的是序列的方式。(Oracle支持序列)。MySQL就不能使用sequnence
D : uuid:适用于字符串主键。使用Hibernate当中一种随机方式生成字符串类型的主键
E:native:本地策略,可以在identity和sequnence之间来进行自动切换
F:assigned:Hibernate会放弃外键的管理,需要通过自己手动编写程序或者用户自己进行设置。
G:foreign:外部的。一对一的一种关联映射的情况下使用。(例如两个表的主键是一一对应的)
3、上述主键生成策略的案例
A、increment:
在映射文件当中修改对应的生成键策略对应的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上插入对应的数据,然后会报错
B:identity:
在映射文件当中修改对应的生成键策略对应的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();
}
F:assigned:
在映射文件当中修改对应的生成键策略对应的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管理,这个就称为托管态的对象。
区分这三种状态的对象
三种状态转换图
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);
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开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!