【Hibernate】04 主键策略 & CRUD
实体类编写规范:
- 每个属性不应该被公开的访问,设置私有
- 提供可以访问和设置的方法,GETTER & SETTER
- 必须编写一个主键属性【ID 唯一值】
- 建议使用基本类型的包装类,因为基本类型不可以表示NULL
主键生成策略:
- HIbernate 要求实体类里面有一个属性作为唯一的值,对应表主键,主键可以不填
<generator class="native" /> <!-- 主键自增策略 -->
- 策略值项:
1、increment
支持long、int、short类型,自增方式的唯一标识,步长1,
无其他进程插入SQL可使用,不支持多线程操作【脏数据危险】
2、identity
采用数据库底层提供的主键生成标识符,
必须是数据库支持的数据类型
3、sequence
根据底层数据库序列生成标识符,
条件是数据库支持序列
4、native
底层数据库对自动生成标识符的能力来选择【2、3、Hilo】其中的一种,
可跨数据库平台开发
【生成:主键、非空、自增、int类型】
5、uuid
128位的UUID算法生成标识符,
绝对唯一标识,占用空间太多
【生成:主键、非空、VARCHAR类型】
Java数据类型要使用Java.lang.String
6、assigned
由Java程序生成标识符,
如果没有指定generator元素,默认使用此策略【自然主键】
按ID查询:
@Test
public void query01(){
Session session = HibernateUtil.getSession(); // 实体类的字节对象,ID值
User user = session.get(User.class, 4);
System.out.println(user);
session.close();
}
修改操作:
先查询,再修改
从思路上是正确的,实际上不需要查询的步骤,
只需要new 一个对象,输入新的字段值和要修改的原始ID
调用UPDATE方法就行了。
另外SAVE也可以用来修改,但是这违背了使用规范,不要这么使用就对了
@Test
public void query02(){
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); // 实体类的字节对象,ID值
User user = session.get(User.class, 4);
System.out.println(user); // 修改字段
user.setUser_name("用户1004"); // 更新操作
session.update(user); transaction.commit();
session.close();
sessionFactory.close();
}
注意:
只修改部分字段,建议使用查询,再改值,在调用修改,因为可以保证其他不变的字段不改动
另外频繁这么修改,性能效率很低,本质上UPDATE是对这个记录完全覆写,
如果数据表一个字段数特别的多,调用修改性能效率真的很低
删除操作:
先查找,后删除
@Test
public void query03(){
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); // 实体类的字节对象,ID值
User user = session.get(User.class, 4);
System.out.println(user); // 删除操作
session.delete(user); transaction.commit();
session.close();
sessionFactory.close();
}
也可以是直接获取ID然后封装给实体类对象
再注入给删除操作
User user = new User();
user.setUser_id(1); // 删除操作
session.delete(user);
实体类对象的状态
- 瞬时状态
对象没有ID值,对象和Session没有关联
- 持久状态
通过Session获取的,对象和Session具有关联关系
- 托管状态
对象有ID值,对象和Session没有关系
SaveOrUpdate方法
根据实体类实例的状态来调用不同的操作
- 注入瞬时状态的对象,执行的是添加操作
- 注入托管状态的对象,执行的是修改操作
- 注入持久状态的对象,执行的是修改操作
【Hibernate】04 主键策略 & CRUD的更多相关文章
- 【hibernate】 hibernate的主键策略
今天使用maven生成一个sping+springMVC+hibernate 的项目,报错如下: 错误提示呢:不能解释这个id的生成策略[uuid.string].就是uuid.string这个hib ...
- hibernate(2) —— 主键策略
框架提供了三种主键生成方式,一种是由用户自己维护,一种是由hibernate框架维护,另一种是由数据库维护. 自己维护就是在插入数据的时候,一定要指定主键的值,否则会出错,如果由框架维护和由数据库维护 ...
- hibernate 注解 主键生成策略
一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue ...
- 大家一起撸代码之——Hibernate各种主键生成策略与配置详解
1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...
- Hibernate中主键生成策略
主键生成策略 increment identity sequence native uuid assigned 1) increment 由hibernate完成 主键递增, 原理:select ma ...
- Hibernate各种主键生成策略与配置详解
出自:http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前 ...
- Hibernate各种主键生成器策略与配置详解(转载)
http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指 ...
- Hibernate各种主键生成策略与配置详解《转》
1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...
- Hibernate各种主键生成策略与配置详解【附1--<generator class="foreign">】
1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...
- Hibernate 主键策略
Hibernate主键生成策略 .自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL ...
随机推荐
- three.js高性能渲染室外场景
大家好,本文在相关文章的基础上,使用three.js渲染了高性能的室外场景,在移动端也有较好的性能,并给出了代码,分析了关键点,感谢大家~ 关键词:three.js.Web3D.WebGL.室外场景. ...
- 01-布局扩展-BFC完成圣杯布局
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- C#.NET根据不同业务类别类型写入不同文件中,动态创建log4net实例验证
C#.NET根据不同业务类别类型写入不同文件中,动态创建log4net实例验证 参考了:https://www.cnblogs.com/-dawn/p/8598566.html GetLog4netI ...
- Kubernetes监控手册02-宿主监控概述
咱们这个系列是讲解 Kubernetes 监控,Kubernetes 自身也是要跑在机器上的,那机器的监控自然也是整个体系的一环.机器层面的监控分为两部分,带内网络和带外网络,通过带内网络做监控主要是 ...
- mysql自带test数据库表的默认属性:Collation latin1_swedish_ci 更新为utf8_general_ci,解决MYSQL数据库乱码
## mysql自带test数据库表的默认属性:Collation latin1_swedish_ci 更新为utf8_general_ci,解决MYSQL数据库乱码USE test;CREATE T ...
- kettle从入门到精通 第七十课 ETL之kettle kettle数据校验,脏数据清洗轻松拿捏
场景:输入在指定的错误(错误应涵盖数据类型不匹配的情况)行数内,trans不报错,但通过错误处理步骤捕捉,并记入文件,整个数据管线正常完成直至处理完最后一个输入行. 解决方案:使用步骤[数据检验]进行 ...
- Diffusers实战
Smiling & Weeping ---- 一生拥有自由和爱,是我全部的野心 1. 环境准备 %pip install diffusers from huggingface_hub impo ...
- Flutter 借助SearchDelegate实现搜索页面,实现搜索建议、搜索结果,解决IOS拼音问题
搜索界面使用Flutter自带的SearchDelegate组件实现,通过魔改实现如下效果: 搜素建议 搜索结果,支持刷新和加载更多 IOS中文输入拼音问题 界面预览 拷贝源码 将SearchDele ...
- mysql5.7msi安装
本文介绍的是只安装MySQL数据库的过程,并不包含各种其他附加工具.安装完成之后通常使用Navicat或SQLyog进行可视化操作. 清华的镜像网站只保存最新的几个MySQL版本,所以直链可能已经失效 ...
- Python_10 debug、类和对象
一.查缺补漏 APP测试流程梳理https://www.cnblogs.com/dengqing9393/p/6497068.html 有关类的知识点http://testingpai.com/art ...