iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >SpringBoot JPA常用注解如何使用
  • 537
分享到

SpringBoot JPA常用注解如何使用

2023-07-05 16:07:07 537人浏览 薄情痞子
摘要

这篇文章主要讲解了“SpringBoot JPA常用注解如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springBoot JPA常用注解如何使用”吧!1. 简介

这篇文章主要讲解了“SpringBoot JPA常用注解如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springBoot JPA常用注解如何使用”吧!

    1. 简介

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

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

    2. 常用注解

    2.1 @Entity

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

    @Entitypublic 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,    SEQUENCE,    IDENTITY,    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> 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@Idprivate 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<Course> courses;}@Entity@Table(name="t_course")public class Course {@GeneratedValue@Idprivate Long course_id;// 要使用 set 集合接收// 默认为lazy懒加载@ManyToMany(mappedBy="courses")private Set<Student> 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@Idprivate Long student_id;@Columnprivate String name;@Columnprivate 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();}

    感谢各位的阅读,以上就是“SpringBoot JPA常用注解如何使用”的内容了,经过本文的学习后,相信大家对SpringBoot JPA常用注解如何使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: SpringBoot JPA常用注解如何使用

    本文链接: https://www.lsjlt.com/news/353521.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • SpringBoot JPA常用注解如何使用
      这篇文章主要讲解了“SpringBoot JPA常用注解如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot JPA常用注解如何使用”吧!1. 简介...
      99+
      2023-07-05
    • JPA中如何使用@EntityListeners注解
      这篇文章给大家介绍JPA中如何使用@EntityListeners注解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JPA实体类监听器@EntityListeners注解的使用被@Prepersist注解的方法 ,完成...
      99+
      2023-06-20
    • JPA之@EnableJpaAuditing注解使用
      目录@EnableJpaAuditing注解使用如何实现自动填充功能,即如何使用审计?Springboot启用Spring Data JPA Auditing(审计功能)Auditi...
      99+
      2024-04-02
    • springboot中@component注解如何使用
      这篇文章主要介绍“springboot中@component注解如何使用”,在日常操作中,相信很多人在springboot中@component注解如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”spr...
      99+
      2023-06-29
    • Springboot JPA如何使用distinct返回对象
      目录JPA如何使用distinct返回对象JPA自定义返回对象方法一方法二方法三方法四JPA如何使用distinct返回对象 package com.frank.jpaBatchSa...
      99+
      2024-04-02
    • 详解SpringBoot的常用注解
      详解SpringBoot的常用注解 在SpringBoot中,注解是一种非常重要的编程方式,它可以简化代码,提高开发效率。本文将详细介绍SpringBoot中的常用注解,以及它们的使用方法和场景。 1. @SpringBootApplica...
      99+
      2023-08-20
      spring boot java mybatis 原力计划
    • SpringBoot使用JPA如何实现读写分离
      今天就跟大家聊聊有关SpringBoot使用JPA如何实现读写分离,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JPA是什么JPA(Java Persistence API)是Sun...
      99+
      2023-05-31
      springboot jpa 读写分离
    • SpringBoot常用注解有哪些
      这篇文章给大家分享的是有关SpringBoot常用注解有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  SpringBoot注解  @SpringBootApplication:开启Spring Boot自...
      99+
      2023-06-02
    • SpringBoot中@Import注解如何正确使用
      目录简介一、功能简介二、示例1.引入普通类2.引入ImportSelector的实现类(1)静态import场景(注入已知的类)(2)动态import场景(注入指定条件的类...
      99+
      2024-04-02
    • Spring Data JPA注解Entity怎么使用
      要使用Spring Data JPA注解@Entity,首先需要创建一个实体类并在类名上添加@Entity注解。这告诉Spring ...
      99+
      2024-03-02
      Spring
    • Spring Data JPA 实体类中常用注解说明
      目录javax.persistence 介绍基本注解关联关系注解关于关系查询的一些注意事项javax.persistence 介绍 Spring Data JPA 采用约定大于配置的...
      99+
      2024-04-02
    • Spring Data JPA注解Entity使用示例详解
      目录1、JPA协议中关于Entity的相关规定需要注意的是:2、常用注解2.1 JPA支持的注解2.2 常用注解3、联合主键3.1 @IdClass3.2 @Embeddable与@...
      99+
      2024-04-02
    • springBoot系列常用注解(小结)
      @PropertySource 作用是:对自定义的properties文件加载 使用:@PropertySource(value={"classpath:people.proper...
      99+
      2024-04-02
    • SpringBoot常用注解实例分析
      这篇文章主要介绍“SpringBoot常用注解实例分析”,在日常操作中,相信很多人在SpringBoot常用注解实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot常用注解实例分析”的疑...
      99+
      2023-06-30
    • SpringBoot常用注解详细整理
      目录前言一、@SpringBootApplication二、@Bean三、@Autowired四、Component家族五、@RestController六、@Scope七、@Con...
      99+
      2024-04-02
    • 详解Spring Data JPA使用@Query注解(Using @Query)
      经过几天的折腾,终于到了学习一个重量级的查询方式上,使用@Query注解,使用注解有两种方式,一种是JPQL的SQL语言方式,一种是原生SQL的语言,略有区别,后者我们更熟悉一些。话不多说,看代码。1、在CustomerRepository...
      99+
      2023-05-31
      spring data jpa
    • SpringBoot常用注解(经典干货)
      目录一、什么是Spring Boot二、Spring常用注解三、Spring Boot常用注解四、选择器五、缓存六、定时器七、注入配置文件properties八、Jpa1、@Enti...
      99+
      2023-01-06
      Spring Boot常用注解 Spring Boot注解
    • 常用的Springboot注解有哪些
      常用的Spring Boot注解有以下几种:1. @SpringBootApplication:该注解用于标记启动类,表示该类是Sp...
      99+
      2023-10-11
      springboot
    • jpa使用注解生成表时无外键问题如何解决
      这篇“jpa使用注解生成表时无外键问题如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“jpa使用注解生成表时无外键问题...
      99+
      2023-07-02
    • springboot常用注解及作用是什么
      Spring Boot 是基于 Spring 框架的快速开发框架,其中常用的注解及作用如下:1. @SpringBootApplic...
      99+
      2023-05-21
      springboot常用注解 springboot
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作