当前位置:

首页 > 编程开发 > SpringBoot JPA常用注解如何使用

SpringBoot JPA常用注解如何使用

1.简介Jpa是一套ORM的规范hibernate不就是一个ORM框架也提供了对于JPA的实现JPA(JavaPersistenceAPI):java持久化API2.常用注解2.1@Entity标注当前类为实体类,将映射到指定的数据库表中@EntitypublicclassUsers{}2.2@Table一般与@Entity注解一起使用,如果数据库表名和类名一致时不使用@Table注解也是可以的,否则需要使用@Table注解来指定表名@Entity@Table(name="t_users")publicc

本文目录

      1. 简介

      Jpa 是一套ORM 的规范
      hibernate 不就是一个 ORM 框架也提供了对于 JPA 的实现

      JPA(Java Persistence API):java 持久化 API

      2. 常用注解

      2.1 @Entity

      标注当前类为实体类,将映射到指定的数据库表中

      @Entity
      public class Users {
      		
      }

      2.2 @Table

      一般与 @Entity 注解一起使用,如果数据库表名和类名一致时不使用 @Table 注解也是可以的,
      否则需要使用 @Table 注解来指定表名

      @Entity
      @Table(name="t_users")
      public class Users {
      		
      }

      2.3 @Id 、@GeneratedValue、@SequenceGenerator、@Column

      2.3.1 @Id

      用于将实体类的属性映射为主键

      2.3.2 @GeneratedValue

      指定主键生成策略

      package javax.persistence;
      /**
       * 策略类型
       */
      public enum GenerationType {
        /**
         * 通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植
         */
        TABLE,
        /**
         * 通过序列产生主键,通过 @SequenceGenerator 注解指定序列名
         * MySql 不支持这种方式
         * Oracle 支持
         */
        SEQUENCE,
        /**
         * 采用数据库 ID自增长的方式来自增主键字段
         * Oracle 不支持这种方式;
         */
        IDENTITY,
        /**
         * 缺省值,JPA 根据数据库自动选择
         */
        AUTO;
      
        private GenerationType() {
        }
      }
      2.3.3 @SequenceGenerator
      2.3.4 @Column

      当实体类属性名和数据库列名不一致时必须要使用此注解

      @Entity
      @Table(name="t_users")
      public class Users {
      
        @Id
        @Column(name = "user_id")
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
        @SequenceGenerator(name = "user_seq", sequenceName = "user_seq")
        private Long userId;
      		
      }

      2.4 @Transient

      表示当前属性无需映射到数据库中

      2.5 @Temproal

      主要针对 Date 类型的属性使用,可以通过该注解指定时间的精度

      @Entity
      @Table(name="t_users")
      public class Users {
      
        @Temporal(TemporalType.DATE) 
        private Date time1;
        
        @Temporal(TemporalType.TIME)
        private Date time2;
        
        @Temporal(TemporalType.TIMESTAMP)
        private Date time3;
      }

      3. EntityManagerFactory

      类似与 hibernate 的 SessionFactory

      4. EntityManager 实体的四种状态

      新建状态: 新创建还未拥有持久性主键持久化状态: 已经拥有持久性主键并和持久化建立了上下文关系游离状态: 拥有持久性主键,但没有和持久化建立上下文关系删除状态: 拥有持久性主键,并且和持久化建立了上下文关系,但是从数据库中删除了

      4.1 find(Class entityClass, Object primaryKey)

      类似于 hibernate 中 session 的 get()

      find 如果没有查询到会返回 null

      4.2 getReference(Class entityClass, Object primaryKey)

      类似与 hibernate 中 session 的 load()
      只有当真正获取对象中的属性时,才会去执行查询的 sql 语句,getReference() 只是返回了一个代理对象

      getReference 如果没有查询到不会返回 null , 会抛出 EntityNotFoundException

      注意:使用此方法可能出现懒加载异常的情况,也就是我们还没有去获取实体类中的属性值,结果 EntityManager 就已经被关闭了

      4.3 persist

      类似与 hibernate 中 session 的 save()

      注意:执行方法时传入的对象不能为主键设置值会抛出异常

      4.4 remove

      类似与 hibernate 中 session 的 delete()

      注意:该方法只能删除持久化对象,而不能删除游离状态的对象(hibernate 可以)

      	/**
      	 * 删除游离态(失败)
      	 */
      	public void testRemove(){
      		Users user = new Users();
      		Users.setUserId(1);
      		entityManager.remove(customer);
      	}
      	
      	/**
      	 * 删除持久化状态(成功)
      	 */
      	public void testRemove(){
      		Users user = entityManager.find(Users.class, 1);
      		entityManager.remove(user);
      	}

      4.5 merge(T entity)

      类似与 hibernate 中 session 的 saveOrUpdate()

      	// 新建状态
      	public void testMerge	(){
      		Users user= new Users();
      		// 省略一系列的set
      		// user.set.....
      		Users newUser = entityManager.merge(user);
      		// user.getUserId() == null  ==> true
      		// newUser.getUserId() == null ==> false
      	}

      SpringBoot JPA常用注解如何使用

      4.6 flush()

      类似与 hibernate 中 session 的 flush()

      将上下文中所有未保存的实体保存到数据库中

      4.6 refresh()

      类似与 hibernate 中 session 的 refresh()

      刷新所有实体的属性值

      5. EntityTransaction

      EntityManager.getTransaction()

      5.1 begin

      5.2 commit

      5.3 rollback

      6. 映射关系

      6.1 单向一对多

      以用户和订单之间的关系为例,一个用户有多个订单,一个订单只属于一个用户
      对于一对多关系的 insert,无论是先插入多的一方还是一的一方都会产生额外的 update 语句,因为多的一端在 insert 时不会插入外键的列

      /**
       * 订单和用户是多对一的关系
       */
      @Entity
      @Table(name="t_order")
      public class Order {
      	// lazy为懒加载,默认为eager立即查询
      	@ManyToOne(fetch=FetchType.Lazy)
      	// @JoinColumn标注字段是一个类,userId为该类的主键
      	@JoinColumn(name="user_id")
      	private Users user;
      }

      6.2 单向多对一

      以用户和订单之间的关系为例,一个用户有多个订单,一个订单只属于一个用户
      对于多对一关系的 insert,最好先保存一的一端然后在保存多的一端。
      如果先保存多的一端再保存一的一端,为了维护外键的关系,需要对多的一端进行额外的update的操作

      /**
       * 订单和用户是多对一的关系
       */
      @Entity
      @Table(name="t_order")
      public class Order {
      	// lazy为懒加载,默认为eager立即查询
      	@ManyToOne(fetch=FetchType.Lazy)
      	// @JoinColumn标注字段是一个类,userId为该类的主键
      	@JoinColumn(name="user_id")
      	private Users user;
      }

      6.3 双向多对一

      以用户和订单之间的关系为例,一个用户有多个订单,一个订单只属于一个用户
      双向多对一就是以上两个的结合,同时使用 @OneToMany 和 @ManyToOne

      /**
       * 用户和订单是一对多的关系
       */
      @Entity
      @Table(name="t_users")
      public class User {
      	// 如果两侧都要描述关联关系的话,维护关联关系的任务要交给多的一方
      	// 使用 @OneToMany 了 mappedBy 的代表不维护关联关系,也就是不会产生额外的update语句
      	// @OneToMany 和 @JoinColumn 不能同时使用会报错
      	@OneToMany(mappedBy="user")
      	private Set orders;
      }
      
      /**
       * 订单和用户是多对一的关系
       */
      @Entity
      @Table(name="t_orders")
      public class Order {
      	// lazy为懒加载,默认为eager立即查询
      	@ManyToOne(fetch=FetchType.Lazy)
      	// @JoinColumn标注字段是一个类,userId为该类的主键
      	@JoinColumn(name="user_id")
      	private Users user;
      }

      SpringBoot JPA常用注解如何使用

      6.4 双向一对一

      以学校和校长之间的关系为例,一个学校只有一个校长,一个校长也只属于一个学校
      一方使用 @OneToMany + @JoinColumn,另一方使用 @OneToOne(mappedBy=“xx”)
      具体由哪一方维护关联关系都可以,这里我们以学校一端维护关联关系为例
      保存时先保存不维护关联关系的一方(也就是使用@OneToOne(mappedBy=“xx”)的一方),否则会产生额外的 update 语句

      /**
       * 学校
       */
      @Entity
      @Table(name="t_school")
      public class School {
      	// 默认为eager立即查询
      	@OneToOne
      	// 添加唯一约束
      	@JoinColumn(name="school_master_id", unique = true)
      	private SchoolMaster schoolMaster;
      }
      
      /**
       * 校长
       */
      @Entity
      @Table(name="t_school_master")
      public class SchoolMaster {
      	// 不维护关联关系要使用 mappedBy
      	@OneToOne(mappedBy="schoolMaster")
      	private School school;
      }

      6.5 双向多对多

      以学生和课程之间的关系为例,一个学生可以选多门课,一个课程也有多个学生,多对多需要一个中间表,也就是选课表
      维护关联关系的一方需要使用 @JoinTable
      关联关系也是只有一方维护即可,这里我们由学生表进行维护

      /**
       * 学生
       */
      @Entity
      @Table(name="t_student")
      public class Student {
      	@GeneratedValue
      	@Id
      	private Long student_id;
      	
      	// 要使用 set 集合接收
      	// 默认为lazy懒加载
      	@ManyToMany
      	// name 为中间表的表名
      	@JoinTable(name="t_student_choose_course",
      			// name 为与中间表与当前表所关联的字段的名称,referencedColumnName 为当前表中与中间表关联的字段的名称
      			joinColumns={@JoinColumn(name="student_id", referencedColumnName="student_id")},
      			// name 为与中间表与多对多另一方表所关联的字段的名称,referencedColumnName 为多对多另一方与中间表关联的字段的名称
      			inverseJoinColumns={@JoinColumn(name="course_id", referencedColumnName="course_id")})
      	private Set courses;
      }
      
      /**
       * 课程
       */
      @Entity
      @Table(name="t_course")
      public class Course {
      	@GeneratedValue
      	@Id
      	private Long course_id;
      	
      	// 要使用 set 集合接收
      	// 默认为lazy懒加载
      	@ManyToMany(mappedBy="courses")
      	private Set students;
      }

      7. 二级缓存

      开启了二级缓存之后,缓存是可以跨越 EntityManager 的,
      默认是一级缓存也就是在一个 EntityManager 中是有缓存的
      二级缓存可以实现,关闭了 EntityManager 之后缓存不会被清除
      使用 @Cacheable(true) 开启二级缓存

      8. JPQL

      8.1 查询接口

      8.1.1 createQuery
      	public void testCreateQuery(){
      		// 这里我们使用了一个 new Student,因为我们是查询 Student 中的部分属性,如果不适用 new Student 查询返回的结果就不是 Student 类型而是一个 Object[] 类型的 List
      		// 也可以在实体类中创建对应的构造器,然后使用如下这种 new Student 的方式,来把返回结果封装为Student 对象
      		String jpql = "SELECT new Student(s.name, s.age) FROM t_student s WHERE s.student_id > ?";
      		// setParameter 时下标是从1开始的
      		List result = entityManager.createQuery(jpql).setParameter(1, 1).getResultList();
      	}
      8.1.2 createNamedQuery

      需要在类上使用 @NamedQuery 注解,事先声明 sql 语句

      @NamedQuery(name="testNamedQuery", query="select * from t_student WHERE student_id = ?")
      @Entity
      @Table(name="t_student")
      public class Student {
      	@GeneratedValue
      	@Id
      	private Long student_id;
      	
      	@Column
      	private String name;
      	
      	@Column
      	private int age;
      }
      	public void testCreateNamedQuery(){
      		Query query = entityManager.createNamedQuery("testNamedQuery").setParameter(1, 3);
      		Student student = (Student) query.getSingleResult();
      	}
      8.1.3 createNativeQuery
      	public void testCreateNativeQuery(){
      		// 本地sql的意思是只能在数据库中执行的sql语句
      		String sql = "SELECT age FROM t_student WHERE student_id = ?";
      		Query query = entityManager.createNativeQuery(sql).setParameter(1, 18);
      		Object result = query.getSingleResult();
      	}

      8.2 关联查询

      存在一对多关系时,当我们查询一的一端时,默认多的一端是懒加载。此时我们如果想要一次性查询出所有的数据就需要使用关联查询

      注意: 下面 sql 中的重点就是要加上 fetch u.orders,表示要查询出用户所关联的所有订单

      	public void testLeftOuterJoinFetch(){
      		String jpql = "FROM t_users u LEFT OUTER JOIN FETCH u.orders WHERE u.id = ?";
      		
      		Users user = (Users) entityManager.createQuery(jpql).setParameter(1, 123).getSingleResult();
      	}
      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发
      相关文章 更多
      JPA在Java中的作用及ORM优势详解
      JPA在Java中的作用及ORM优势详解

      JPA是Java中的ORM规范,通过标准API简化数据库操作。它统一了不同ORM框架的操作方式,降低了学习成本,提高了代码可移植性。Hibernate是JPA的一个实现,提供了更多扩展功能。1.在SpringBoot中使用JPA需添加spring-boot-starter-data-jpa依赖,并用@Entity和@Repository注解定义实体和数据访问层。2.EntityManager是JPA核心接口,负责管理实体生命周期,可通过@PersistenceContext注入。3.@Query注解用于编

      springBoot项目常用目录有哪些
      springBoot项目常用目录有哪些

      springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

      检验你对Java JPA持久化框架的熟练程度:精选面试问题
      检验你对Java JPA持久化框架的熟练程度:精选面试问题

      什么是JPA?它与JDBC有什么区别?JPA(JavaPersistenceapi)是一个用于对象关系映射(ORM)的标准接口,它允许Java开发者使用熟悉的Java对象来操作数据库,而无需编写直接针对数据库的sql查询。而JDBC(JavaDatabaseConnectivity)是Java用于连接数据库的标准API,它需要开发者使用SQL语句来操作数据库。JPA将JDBC封装起来,为对象-关系映射提供了更方便、更高级别的API,简化了数据访问操作。在JPA中,什么是实体(Entity)?实体是JPA中

      Java JPA和其他持久化框架之间的对比:哪一个更符合你的需求?
      Java JPA和其他持久化框架之间的对比:哪一个更符合你的需求?

      JPA(JavaPersistenceapi)是一个标准的JavaAPI,它提供了一组用于访问和持久化数据对象的接口。JPA是JPA工作组的成果,该工作组由SunMicrosystems(现为oracle)和其他公司组成。JPA于2006年12月发布,并已成为JavaPersistenceAPI规范的标准实现。JPA框架提供了以下主要特性:对象-关系映射(ORM)事务管理查询JPAORM将数据库表映射到Java对象,以便您可以使用标准的JavaAPI来操作数据库数据。JPA事务管理允许您对多个数据库操作进

      探索Java JPA技术:掌握最新趋势和最佳策略
      探索Java JPA技术:掌握最新趋势和最佳策略

      JavaJPA(JavaPersistenceapi)是一种用于Java的持久化框架。它允许您将对象存储到数据库中,并从数据库中检索对象。JPA是一个标准API,有多种实现可供选择,包括EclipseLink、Hibernate和TopLink。JPA2.2是JPA的最新版本。它包含了许多新特性和改进,包括:对Java8的支持对NoSQL数据库的支持改进的缓存支持改进的多线程支持JPA是构建持久性应用程序的理想选择。它易于使用,并且可以很容易地与其他Java技术集成。JPA还可以提高应用程序的性能和可扩展

      Java JPA项目实践指南: 从基础到高级
      Java JPA项目实践指南: 从基础到高级

      一、JavaJPA项目实战指南概述JavaJPA(JavaPersistenceapi)是一种Java规范,它定义了对象/关系映射(ORM)的标准,JPA允许开发人员使用Java编程语言进行对象持久化,并与关系型数据库进行交互。JPA提供了一组标准的注解和API,这些注解和API可以将Java对象映射到数据库表,并完成数据持久化操作。二、使用JPA的好处1.简化数据访问:JPA提供了一套标准的API,可以简化对数据库的访问,无需直接编写sql语句。2.提高开发效率:JPA可以通过注解自动完成对象与数据库表

      借助先驱者的智慧:深入研究 Hibernate 框架的关键概念
      借助先驱者的智慧:深入研究 Hibernate 框架的关键概念

      Hibernate:助力Java应用轻松访问数据库在当今飞速发展的软件开发领域,数据管理和持久化技术至关重要。Hibernate作为一款备受欢迎的Java持久层框架,以其强大而灵活的特性,为开发者们提供了极大的便利。这篇文章将带你深入探索Hibernate的知识点,以便你更好地理解和使用它。一、Hibernate入门:揭开持久化框架的神秘面紗Hibernate作为一款持久的框架,它可以将Java对象转换为数据库记录,并能够在需要时重新获取这些Java对象。这为数据访问带来诸多便利,开发者无需再编写繁杂的s

      推荐充满活力的 Java JPA 开源项目,为你的项目增添新的动力
      推荐充满活力的 Java JPA 开源项目,为你的项目增添新的动力

      在Java编程领域,JPA(JavaPersistenceapi)作为一种流行的持久化框架,为开发者提供了对关系型数据库进行操作的便捷方式。通过使用JPA,开发者可以轻松地将Java对象持久化到数据库中,并从数据库中检索数据,从而极大地提高了应用程序的开发效率和维护性。本文精心挑选了10个高质量的JavaJPA开源项目,涵盖了各种不同的功能和应用场景,旨在为开发者提供更多的灵感和解决方案,助力打造更高效和可靠的应用程序。这些项目包括:SpringDataJPA:springDataJPA是Spring生态

      JPA与MyBatis:功能性能对比分析
      JPA与MyBatis:功能性能对比分析

      JPA和MyBatis:功能与性能对比分析引言:在Java开发中,持久化框架扮演着非常重要的角色。常见的持久化框架包括JPA(JavaPersistenceAPI)和MyBatis。本文将对这两个框架的功能和性能进行对比分析,并提供具体的代码示例。一、功能对比:JPA:JPA是JavaEE的一部分,提供了一种面向对象的数据持久化解决方案。它通过注解或X

      如何在选择JPA和MyBatis之间做出正确的ORM工具选择
      如何在选择JPA和MyBatis之间做出正确的ORM工具选择

      JPA还是MyBatis:选择合适的ORM工具的准则,需要具体代码示例引言:在现代软件开发中,使用ORM(对象关系映射)工具是非常常见的。ORM工具能够将关系型数据库中的表与对象模型间进行映射,大大简化了开发过程。然而,在选择使用哪个ORM工具时,很多开发者常常感到困惑。本文将讨论如何选择适合的ORM工具,重点比较JPA和MyBatis,并给出具体的代码示例

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。