原文链接: 191119-SpringBoot系列教程JPA之指定id保存 前几天有位小伙伴问了一个很有意思的问题,使用 JPA 保存数据时,即便我指定了主键 id,但是新插入的数据主键却是 mysql...Insert 教程 首先简单的看一下,我们一般使用默认的数据库自增生成主键的使用方式,以便后面的自定义主键生成策略的对比 对于 jpa 的插入数据的知识点不太清楚的同学,可以看一下之前的博文: 190614...) 大胆猜测,save 的执行过程逻辑如 首先根据 id 到数据库中查询对应的数据 如果数据不存在,则新增(插入 sql 不指定 id) 如果数据存在,则判断是否有变更,以确定是否需要更新 2....,官方提供了四种 取值 说明 GenerationType.TABLE 使用一个特定的数据库表格来保存主键 GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列...,因为没有 id,所以插入的 sql 中也没有指定 id,使用 mysql 的自增来生成主键 id
1.2 JPA 简介 1.2.1 概述 我们都知道不同的数据库厂商都有自己的实现类,后来统一规范也就有了数据库驱动, Java 在操作数据库的时候,底层使用的其实是 JDBC,而 JDBC 是一组操作不同数据库的规范...☞ 高级特性 JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化...答案是否定的,也就是说,如果使用 JPA 规范进行数据库操作,底层需要 hibernate 作为其实现类完成数据持久化工作。 ?...注解 ☞ 常用注解 注解 说明 属性 @Entity 指定当前类是实体类 @Table 指定实体类和表之间的对应关系,不指定则默认表名为类名全小写 name:指定数据库表的名称 @Id 指定当前字段是主键...JPA 提供的四种标准用法: ♞ IDENTITY:主键由数据库自动生成(主要是自动增长型) ♞ SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
一、JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的...@id和@GeneratedValue都是JPA的标准用法, JPA提供四种标准用法,由@GeneratedValue的源代码可以明显看出....TABLE:使用一个特定的数据库表格来保存主键。 SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。...assigned: 在插入数据的时候主键由程序处理(即程序员手动指定),这是 元素没有指定时的默认生成策略。等同于JPA中的AUTO。...increment: 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。
Insert使用教程 在开始之前,先声明一下,因为个人实际项目中并没有使用到JPA,对JPA的原则和hibernate的一些特性了解的也不多,目前处于学习探索阶段,主要是介绍下使用姿势,下面的东西都是经过测试得出...使用一个特定的数据库表格来保存主键 GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列 GenerationType.IDENTITY 主键由数据库自动生成...插入时默认值支持方式 在创建表的时候,我们知道字段都有默认值,那么如果PO对象中某个成员我不传,可以插入成功么?会是默认的DB值么?...从输出结果来看: 如果这个id对应的记录不存在,则新增 如果这个id对应的记录存在,则更新 不然这个注解可以主动指定id方式进行插入or修改,那么如果没有这个注解,插入时也不指定id,会怎样呢?...小结 本文主要介绍了下如何使用JPA来实现插入数据,单个or批量插入,也抛出了一些问题,有的给出了回答,有的等待后文继续跟进,下面简单小结一下主要的知识点 POJO与表关联方式 注意几个注解的使用 如
总的来说JPA是ORM规范,Hibernate、TopLink等是JPA规范的具体实现,这样的好处是开发者可以面向JPA规范进行持久层的开发,而底层的实现则是可以切换的。...因此为了简化开发, 我们可以将其交给jpa来自动填充。 审计功能的创建人和修改者的注入方式下一节再讲哦,贪多嚼不烂。...不,已经结束了。 可以看到,这个接口继承了JpaRepository,spring-data-jpa只需要这个信息,就可以帮你完成常用的操作:增删查改。...这一节不具体展开JpaRepository中所包含的所有方法,单纯使用最简单的增删查改来过瘾 4.Service业务逻辑层 业务逻辑层是程序的逻辑核心,所有的重要的逻辑操作都应该往Service中写,而不是写到...自动通过序列生成, name是提交的数据, 版本号自动插入为0, createdBy,lastUpdatedBy由于还未配置完整,暂时没有数据, createdDate,lastUpdatedDate在插入时皆为当前时间
JPA 和 Hibernate 的关系 JPA 是规范:JPA 本质上是一种 ORM 规范,不是 ORM 框架,只是定制了一些规范,提供了一些编程的 API 接口,具体实现由 ORM 厂商实现 Hibernate...**@Table** 当实体类与其映射的数据库表名不同名时需要使用 @Table 标注说明,该标注与 @Entity 标注并列使用 **@id** @Id 标注用于声明一个实体类的属性映射为数据库的主键列...,Oracle 不支持这种方式 AUTO: JPA自动选择合适的策略,是默认选项 TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。...remove():类似于 Hibernate 中 Session 的 delete 方法,但此方法只可删除持久化对象,而 hibernate 的方法可以删除游离对象(不在缓存中,但在数据库中可能有对象,...方法测试 保存数据(先保存不维护关联关系的一端,否则会多出 UPDATE 语句) ? 使用 IDEA 反向生成实体(双向一对一) ?
今天在使用数据库的时候,遇到一个场景,即在插入数据完成后需要返回此数据对应的自增主键id,但是在使用Mybatis中的generatedKey且确认各项配置均正确无误的情况下,每次插入成功后,返回的都是...1,而不是最新的自增Id。...终于凭借着一次Debugg发现的问题,原来在使用Mabatis中的insert或者insertSelective方式插入时,如使用int insert(TestGenKey testGenKey)时,返回值...int表示的是插入操作受影响的行数,而不是指的自增长id,那么返回的自增id到底去哪里了呢?...null : sex.trim(); } } 测试及Debugg 编写测试方法测试插入 插入成功后观察对应的变量对应的值 总结:调用Insert后插入操作之后,所得到自增长Id被赋值到原对象当中
2.4高级特性 JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化...@GeneratedValue 指定如何标识属性可以被初始化,例如自动、手动、或从序列表中获得的值。 @Transient 指定的属性,它是不持久的,即:该值永远不会存储在数据库中。...·validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。...我们使用postman来测试: 然后通过查询数据库来看一下结果: 我们可以看到成功插入了数据,并且观察表结构可以看到,agee是我们定义的column名称,id为自增。...我们也可以在日志中看到hibernate输出的日志: Hibernate: select person0_.id as id1_0_, person0_.agee as agee2_0_, person0
本文详细介绍了,Spring Boot环境下如何使用Spring-data-jpa 来访问和操作数据库。...=true spring.data.jpa.repositories.enabled=true ddl-auto的四种状态: create: 每次加载hibernate时都会删除上一次的生成的表,然后根据你的...validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。... Entity中不映射成列的字段得加@Transient 注解 这是主键的生成策略,四种方式: JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO. ...TABLE:使用一个特定的数据库表格来保存主键。 SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
高级特性 JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。...JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现。JPA怎么取代Hibernate呢?...答案是否定的,也就是说,如果使用JPA规范进行数据库操作,底层需要hibernate作为其实现类完成数据持久化工作。 ? JPA入门案例 1.搭建开发环境 第一步:创建一个maven工程 ?...如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字搭建开发环境[重点] 第六步:配置JPA的核心配置文件 在java工程的resources路径下创建一个名为META-INF的文件夹,在此文件夹下创建一个名为...JPA主键生成策略 通过annotation(注解)来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的
: could not execute statement 摘要 当我们在使用 Hibernate 或 JPA 进行数据库操作时,可能会遇到 could not execute statement; SQL...SQLGrammarException 是由 Hibernate 或 JPA 抛出的异常,表示无法执行 SQL 语句,通常是由于 SQL 语法错误或数据映射不匹配导致的。...使用正确的 JPA 注解(如 @Column、@Id 等)为字段添加准确的映射信息。...解决方案: 确保数据库中的表具有正确的主键和外键约束。 插入或更新数据时,确保满足表的约束条件。...参考资料 Spring Data JPA 官方文档 Hibernate 官方文档 Stack Overflow 相关问题解答 总结与未来展望 数据库交互总是有挑战的,尤其是当使用 ORM 框架时。
其实,在阿粉的眼中,JPA好像就是和Hibernate是一样的东西,区别并不大。 Spring Data JPA是Spring Data的子模块。...规范,Hibernate是JPA规范的具体实现,这样的好处是开发者可以面向JPA规范进行持久层的开发,而底层的实现则是可以切换的。...为什么这么多公司会选择 Mybaits ,而不选择使用 SpringDataJPA 呢? 因为Spring Data Jpa的开发难度要大于Mybatis。...TABLE:使用一个特定的数据库表格来保存主键 SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。...这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列) IDENTITY:主键由数据库自动生成(主要是支持自动增长的数据库,如mysql
bean中的一些属性忽略掉,序列化和反序列化都受影响。...: JPA自动选择合适的策略,是默认选项; SEQUENCE:通过序列产生主键,通过@SequenceGenerator 注解指定序列名,MySql不支持这种方式 TABLE:通过表产生主键,框架借由表模拟序列产生主键...可以用来在使用jpa的时记录一些业务无关的字段,比如最后更新时间等等。...,此时的数据还没有真实插入进数据库。...来源:https://www.erlo.vip/share/9/5086.html 由于项目时间紧张,关于JPA的注解和使用就先记录到这里,有待以后补充。 ----
,事务回滚并没有效果,数据已经插入到DB中: 搜索了下,发现有人提到说MySQL数据库的事务不生效,可能和引擎类型有关系,因此下一步往这个方向排查一下。...修改JPA自动创建表时的引擎 测试工程中,使用的是JPA自动创建数据表的方式,默认情况下,创建出来数据表使用的是MyISAM引擎,因此如果需要使用事务,可以手动配置下,指定使用InnoDB引擎进行创建数据表...in the log or console spring.jpa.show-sql=true spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl...spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl...为什么事务对MyISAM引擎不生效呢 为什么Spring的事务无法控制MySQL的MyISAM引擎类型数据表操作呢?
一、Spring Data JPA 介绍 JPA(Java Persistence API)Java持久化API,是 Java 持久化的标准规范,Hibernate是持久化规范的技术实现,而Spring...Data JPA是在 Hibernate 基础上封装的一款框架。...[没表-创建-操作 | 有表-更新没有的属性列-操作] validate:每次加载 hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。...3.1.2 事务不生效的原因 3.1.2.1 确认数据库引擎 在application.properties配置数据库引擎为InnoDB: spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect...四、常见错误 在 Spring Data JPA 的使用当中,可能会遇到如下的一些错误。
一、Spring Data JPA 介绍 JPA(Java Persistence API)Java持久化API,是 Java 持久化的标准规范,Hibernate是持久化规范的技术实现,而Spring...Data JPA是在 Hibernate 基础上封装的一款框架。...没表-创建-操作 | 有表-更新没有的属性列-操作 validate:每次加载 hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。...3.1.2 事务不生效的原因 3.1.2.1 确认数据库引擎 在application.properties配置数据库引擎为InnoDB: spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect...四、常见错误 在 Spring Data JPA 的使用当中,可能会遇到如下的一些错误。
JPA的优势 标准化 容器级特性的支持 简单方便 查询能力 高级特性 JPA与hibernate的关系 JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate...JPA怎么取代Hibernate呢?JDBC规范可以驱动底层数据库吗?答案是否定的,也就是说,如果使用JPA规范进行数据库操作,底层需要hibernate作为其实现类完成数据持久化工作。...--jpa提供者的可选配置:我们的JPA规范的提供者为hibernate,所以jpa的核心配置中兼容hibernate的配 --> <!...,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法。...GenerationType.IDENTITY Oracle使用最多是底层序列化增长:GenerationType.SEQUENCE jpa操作的操作步骤 1.加载配置文件创建实体管理器工厂
它是一个非常强大的ORM持久化的解决方案,免去了使用JDBCTemplate 开发的编写脚本工作。JPA通过简单约定好接口方法的规则自动生成相应的 JPQL 语句,然后映射成 POJO 对象。...JPA是一个规范化接口,封装了 Hibernate 的操作作为默认实现,让用户不通过任何配置即可完成数据库的操作。JPA、SpringData 和 Hibernate的关系如图所示。...hibernate: format_sql: true 主要说明一下 spring.jpa.hibernate.ddl-auto这个属性: 属性 说明 create 每次应用启动的时候会重新根据实体建立表...很多网上教程使用的是增加如下配置: spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect 虽然也能达到效果...当然在一些情况下,我们并不希望使用JPA自动为我们创建的表,我们可以先提前建好表,最后再根据表结构定义实体类。
使用Jpa 在使用 spring boot jpa的情况下设置 spring.jpa.hibernate.ddl-auto的属性设置为 create or create-drop的时候,spring boot...validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。 5、 none : 什么都不做。...thymeleaf 设置不校验html标签 默认配置下,thymeleaf对.html的内容要求很严格,比如,如果少封闭符号/,就会报错而转到错误页。...也比如你在使用Vue.js这样的库,然后有这样的html代码,也会被thymeleaf认为不符合要求而抛出错误。...,所以使用这种方法的时候不需要重新定义实例ID的规则就能产生不同的实例ID了。
第4章 JPA中的主键生成策略 通过annotation(注解)来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue...设定的.这里的@id和@GeneratedValue都是JPA的标准用法。...JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO。...) private Long custId; SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。...,例如设置1,则表示每次插入新记录后自动加1,默认为50 int allocationSize() default 50; } AUTO:主键由程序控制 @Id
领取专属 10元无门槛券
手把手带您无忧上云