返回顶部
首页 > 资讯 > 后端开发 > Python >SpringDataJPA在Entity中常用的注解介绍
  • 798
分享到

SpringDataJPA在Entity中常用的注解介绍

2024-04-02 19:04:59 798人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录首先我们常用的注解包括接下来介绍关联关系注解首先我们常用的注解包括 @Entity、@Table、@Id、@IdClass、@GeneratedValue、@Basic、@Tra

首先我们常用的注解包括

@Entity、@Table、@Id、@IdClass、@GeneratedValue、@Basic、@Transient、@Column、@Temporal、@Enumerated、@Lob

  • @Entity使用此注解定义的对象将会成为被JPA管理的实体,将映射到指定的数据库表@Entity(name =“user”)其中name默认是此实体类的名字,全局唯一。
  • @Table指定此实体类对应的数据库的表名。若注解不加名字则系统认为表名和实体类的名字相同
  • @Id定义字段为数据库的主键,一个实体里面必须有一个。
  • @IdClass利用外部类的联合主键,其中外部类必须满足一下几点要求

必须实现Serializable接口。

必须有默认的public无参数的构造方法。

必须覆盖equals和hashCode方法。equals方法用于判断两个对象是否相同,EntityManger通过find方法来查找Entity时是根据equals的返回值来判断的。hashCode方法返回当前对象的哈希码,生成的hashCode相同的概率越小越好,算法可以进行优化

  • @GeneratedValue为主键生成策略

默认为AUTO即JPA自动选择合适的策略

IDENTITY 适用于Mysql,策略为自增

SEQUENCE 通过序列生成主键通过@SquenceGenerator指定序列名mysql不支持

TABLE 框架由表模拟产生主键,使用该策略有利于数据库移植

  • @Basic表示此字段是映射到数据库,如果实体字段上没有任何注解默认为@Basic。其中可选参数为@Basic(fetch =FetchType.LAZY, optional =false)其中fetch默认为EAGER立即加载,LAZY为延迟加载、optional表示该字段是否可以为null
  • @Transient和@Basic的作用相反,表示该字段不是一个到数据库表的字段映射,JPA映射数据库的时候忽略此字段。
  • @Column定义实体内字段对应的数据库中的列名

@Column(name = "real_name", unique = true, nullable = false, insertable = false, updatable = false, columnDefinition = "varchar", length = 100)

name对应数据库的字段名,可选默认字段名和实体属性名一样

unique是否唯一,默认false,可选

nullable是否允许为空。可选,默认为true

insertable执行insert的时候是否包含此字段。可选,默认true

updatable执行update的时候是否包含此字段。可选,默认true

columnDefinition表示该字段在数据库中的实际类型

length数据库字段的长度,可选,默认25

  • @Temporal用来设置Date类型的属性映射到对应精度的字段

@Temporal(TemporalType.DATE)    //映射为只有日期
@Temporal(TemporalType.TIME)    //映射为只有时间
@Temporal(TemporalType.TIMESTAMP)  //映射为日期+时间
  • @Lob将字段映射成数据库支持的大对象类型,支持一下两种数据库类型的字段。(注意:Clob、Blob占用的内存空间较大,一般配合@Basic(fetch= FetchType.LAZY)将其设置为延迟加载)

Clob:字段类型为Character[]、char[]、String将被映射为Clob

Blob:字段类型为Byte[]、byte[]和实现了Serializable接口的类型将被映射为Blob类型

接下来介绍关联关系注解

@JoinColumn、@OneToOne、@OneToMany、@ManyToOne、@ManyToMany、@JoinTable、@OrderBy

1.@JoinColumn定义外键关联字段名称,其中属性意义如下

  • name表示目标表的字段名,必填
  • referencedColumnName本实体表的字段名,非必填,默认是本表的ID
  • unique外键字段是否唯一,可选,默认false
  • nullable外键字段是否允许为空,可选,默认true
  • insertable新增操作的时候是否跟随一起新增,可选,默认true
  • updatable更新时候是否一起更新。可选,默认true
  • @JoinColumn主要配合@OneToOne、@ManyToOne、@OneToMany一起使用,单独使用没有任何意义。
  • @JoinColumns定义多个字段的关联关系

2.@OneToOne一对一关联关系


@OneToOne(targetEntity = SysRole.class, cascade = {CascadeType.PERSIST,CascadeType.REMOVE,CascadeType.REFRESH,CascadeType.MERGE},fetch = FetchType.LAZY,optional = false,mappedBy = "userId",orphanRemoval = true)
  • targetEntity非必填,默认为该字段的类型
  • cascade级联操作策略CascadeType.PERSIST级联新建,CascadeType.REMOVE级联删除,CascadeType.REFRESH级联刷新,CascadeType.MERGE级联更新,CascadeType.ALL四项全选
  • fetch数据加载方式,默认EAGER(立即加载),LAZY(延迟加载)
  • optional是否允许为空。可选,默认为true
  • mappedBy关联关系被谁维护,非必填,一般不需要特别指定。注意:只有关系维护方才能操作两者的关系,被维护方即使设置了维护方的属性进行存储也不会更新外键关联。mappedBy不能与@JoinColumn或者@JoinTable同时使用。mappedBy的值指的是另一方的实体里面属性的字段,而不是数据库字段,也不是实体对象的名字,即另一方配置了@JoinColumn或者@JoinTable注解的属性的字段名称
  • orphanRemoval是否级联删除,和CascadeType.REMOVE效果一样,两种只要配置一种就会自动级联删除
  • @OneToOne需要配合@JoinColumn一起使用,可以双向关联,也可以只配置一方。下面我们举一个例子:假设一个用户只拥有一个角色SysUser如下

@OneToOne
@JoinColumn(name = "role_id",referencedColumnName = "user_id")
private SysRole role;
//若需要双向关联则SysRole的内容如下
@OneToOne(mappedBy = "role")
private SysUser user;
//当然也可以不用选择mappedBy,使用下面效果也一样
@OneToOne
@JoinColumn(name = "user_id",referencedColumnName = "role_id")
private SysUser user;

3.@OneToMany和@ManyToOne一对多和多对一的关联关系


@Entity
@Table(name="user")
class User implements Serializable{
    private Long userId;
    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY,mappedBy = "user")
    private Set<Role> setRole;
}
@Entity
@Table(name="role")
class Role{
    private Long roleId;
    @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinColumn(name = "user_id")//user_id字段作为外键
    private User user;
}

4.@OrderBy关联查询的时候排序,一般和@OneToMany一起使用


@Entity
@Table(name="user")
class User implements Serializable{
    private Long userId;
    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY,mappedBy = "user")
    @OrderBy("role_name DESC")
    private Set<Role> setRole;
}

5.@JoinTable关联关系表一般和@ManyToMany一起使用

@ManyToMany表示多对多,也有单双向之分,单双向和注解无关,只看实体类之间是否相互引用


@JoinTable(name = "sys_user_role",
  joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
        inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")})
@ManyToMany(cascade = {CascadeType.REFRESH}, fetch = FetchType.EAGER)
private List<SysRole> roles;
  • @JoinTable中name表示中间关联关系表名
  • @JoinTable中的joinColumns表示主链接表的字段,即当前对象内对应的连接字段
  • @JoinTable中inverseJoinColumns表示被连接的表的外键字段

6.Left Join、Inner join和@EntityGraph

当使用@ManyToMany、@ManytoOne、@OneToMany、@OneToOne关联关系的时候sql执行查询的时候总是一条主查询语句和N条子查询语句组成,运行的效率较地下,如果子对象有N个就会执行N+1条SQL,JPA2.1推出的@EntityGraph、@NamedEntityGraph用来提高查询效率@NamedEntityGraph配置在@Entity上面,而@EntityGraph配置在Repository的查询方法上面


@NamedEntityGraph(name = "User.addressEntityList",attributenodes = {@NamedAttributeNode("setRole"),@NamedAttributeNode("dept")})
@Entity
@Table(name="user")
public class User implements Serializable{
    private Long userId;
    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY,mappedBy = "user")
    @OrderBy("role_name DESC")
    private Set<Role> setRole;
    @OneToOne
    @JoinColumn(name = "dept_id",referencedColumnName = "user_id")
    private Department dept;
}

然后只需要在Repository查询方法上面加上@EntityGraph注解即可,其中value就是@NamedEntityGraph中的Name,配置如下


@EntityGraph(value ="User.addressEntityList")
List<User> findAll();

对于关系查询需要注意以下事项:

  • 所有的注解要么全部配置在字段上,要么全部配置在get方法上面,不能混用,混用项目就会启动不起来
  • 所有关联都支持单双向关联。当JSON序列化的时候使用双向注解会产生死循环,需要人为手动转换一次,或者使用@jsonIgnore
  • 所有的关联表一般不需要建立外键索引

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: SpringDataJPA在Entity中常用的注解介绍

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

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

猜你喜欢
  • SpringDataJPA在Entity中常用的注解介绍
    目录首先我们常用的注解包括接下来介绍关联关系注解首先我们常用的注解包括 @Entity、@Table、@Id、@IdClass、@GeneratedValue、@Basic、@Tra...
    99+
    2024-04-02
  • SpringDataJPA在Entity中常用的注解有哪些
    这篇文章主要介绍了SpringDataJPA在Entity中常用的注解有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先我们常用的注解包括@Entity、@Table、...
    99+
    2023-06-21
  • SpringBoot中@Conditional注解介绍
    目录1. @Conditional 注解2. Springboot扩展1. @Conditional 注解 @Conditional注解是Spring-context模块提供了一个注...
    99+
    2024-04-02
  • Android 中的注解详细介绍
    注解是我们经常接触的技术,Java有注解,Android也有注解,本文将试图介绍Android中的注解,以及ButterKnife和Otto这些基于注解的库的一些工作原理. 归...
    99+
    2022-06-06
    注解 Android
  • 关于@Query注解的用法(SpringDataJPA)
    目录@Query注解的用法1.一个使用@Query注解的简单例子2.Like表达式3.使用Native SQL Query4.使用@Param注解注入参数5.SPEL表达式(使用时请...
    99+
    2024-04-02
  • SpringBoot中的Condition包下常用条件依赖注解案例介绍
    目录一、@ConditionalOnClass() Spring中存在指定class对象时,注入指定配置1.首先引入pom依赖2.实体类测试对象3.定义@ConditionalOnC...
    99+
    2024-04-02
  • Kotlin中@JvmOverloads注解作用示例介绍
    在Kotlin中@JvmOverloads注解的作用:指示Kotlin编译器为此函数生成替换默认参数值的重载。 如果一个方法有N个参数,其中M个具有默认值,则会生成M个重载。 第一个...
    99+
    2024-04-02
  • MySQL中常用的函数介绍
    这期内容当中小编将会给大家带来有关MySQL中常用的函数介绍,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。MySQL函数是MySQL数据库提供的内部函数。这些内部函数可以...
    99+
    2024-04-02
  • jQuery中的常用事件介绍
    一、jQuery事件的分类 jQuery事件是对JavaScript事件的封装,常用事件分类如下: 1、基础事件 window事件。鼠标事件。键盘事件。表单事件。 2、复合事件是多个...
    99+
    2024-04-02
  • Java中@DateTimeFormat和@JsonFormat注解介绍
    目录1.@DateTimeFormat注解1.1@DateTimeFormat注解简介1.2@DateTimeFormat注解的功能1.3@DateTimeFormat注解的注意点1...
    99+
    2022-11-13
    @datetimeformat @jsonformat注解 datetimeformat注解 @jsonformat注解
  • 介绍java的注解类型
    这篇文章主要介绍“介绍java的注解类型”,在日常操作中,相信很多人在介绍java的注解类型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”介绍java的注解类型”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-06
  • springdatajpa@Query注解中delete语句报错的解决
    目录springdatajpa@Query注解中delete语句报错项目中需要删除掉表中的一些数据JPA使用@Query注解实例1.一个使用@Query注解的简单例子2.L...
    99+
    2024-04-02
  • android SDk中常用的java包介绍
    下面是android SDK中API中的主要java包的功能简介:  代码如下:android.app :提供高层的程序模型、提供基本的运行环境android.c...
    99+
    2022-06-06
    java包 JAVA sdk Android
  • C#中常用的IO操作介绍
    在.Net 4.0中增加了一系列较为实用的IO功能,下面让我们来一起看一下吧: 1. Stream.CopyTo Stream.CopyTo在用于较小的Stream之间的拷贝时还是比...
    99+
    2024-04-02
  • MySQL5.6中常用的函数用法介绍
    本篇内容主要讲解“MySQL5.6中常用的函数用法介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL5.6中常用的函数用法介绍”吧! ...
    99+
    2024-04-02
  • java中基本注解的知识点介绍
    本篇内容主要讲解“java中基本注解的知识点介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中基本注解的知识点介绍”吧!java.lang.Override是一个标记类型注解,它被用作...
    99+
    2023-06-20
  • Spring注解 @EventListener 的介绍与使用示例以及异常处理
    文章目录 基本概念用途事件处理条件处理器返回值异常处理异步监听器监听器排序源码 使用示例单一事件监听器使用classes实现多事件监听器使用condition筛选监听的事件有返回值的监听...
    99+
    2023-09-04
    spring java spring boot
  • Java注解的介绍和使用详细讲解
    文章目录 注解注解基本介绍自定义注解元注解注解解析 注解 注解基本介绍 注解概述: Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 Java 语言中的类、构造器、方法...
    99+
    2023-08-16
    java junit 开发语言
  • SpringBoot @Configuration与@Bean注解使用介绍
    目录demo示例特点和特性之前我们都是通过xml的方式定义bean,里面会写很多bean元素,然后spring启动的时候,就会读取bean xml配置文件,然后解析这些配置,然后会将...
    99+
    2022-11-13
    SpringBoot @Configuration注解 SpringBoot @Bean注解
  • WPF中ImageBrush常用方式介绍
    WPF的ImageBrush是一个比较常见也比较复杂的笔刷,它继承自图块笔刷(TileBrush)。使用图块画笔绘制区域涉及以下三个组成部分:内容、基本图块和输出区域。基本输出过程如...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作