JPA 概述及描述对象和表之间的映射关系注解

参考文档:JPA 概述及常用注解详解、SpringDataJpa 使用指南-阿里云开发者社区 (aliyun.com)

概述

        JPA(Java Persistence API)是 Java 标准中的一套ORM规范(提供了一些编程的 API 接口,具体实现由 ORM 厂商实现,如Hiernate、TopLink 、Eclipselink等都是 JPA 的具体实现),借助 JPA 技术可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中(即Object Model与Data Model间的映射)。

        JPA是Java持久层API,由Sun公司开发,希望规范、简化 Java 对象的持久化工作,整合ORM 技术,整合第三方 ORM 框架,建立一种标准的方式,目前也是在按照这个方向发展,但是还没能完全实现。在ORM框架中,Hibernate框架做了较好的 JPA 实现,已获得 Sun 的兼容认证。

JPA 的优势:

        1.开发者面向 JPA 规范的接口,但底层的JPA实现可以任意切换:觉得Hibernate好的,可以选择Hibernate JPA实现;觉得TopLink好的,可以选择TopLink JPA实现。

        2.开发者可以避免为使用 Hibernate 学习一套 ORM 框架,为使用 TopLink 又要再学习一套ORM 框架。

JPA为我们提供了以下规范:

  • ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中
  • JPA的 Criteria API:提供 API 来操作实体对象,执行 CRUD 操作,框架会自动将之转换为对应的 SQL,使开发者从繁琐的 JDBC、SQL中解放出来。
  • JPQL查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

JPA 注解

        实体对象持久化到数据库的示例代码:

@Data
@Entity
@Table(name = "t_business_order",//建立索引indexes = {@Index(name="orderId",columnList="orderId",unique=true),@Index(name="businessId",columnList="businessId",unique=false),@Index(name="goodsId",columnList="goodsId",unique=false),@Index(name="deviceId",columnList="deviceId",unique=false)}
)
public class TBusinessOrder {//用户编号@Id//自增@GeneratedValue(strategy= GenerationType.IDENTITY)//长整型@Column(name="id",nullable=false,columnDefinition="BIGINT comment '自增'" )private Long id;@Column(name="orderId",nullable=false,unique = true,columnDefinition="VARCHAR(255)  comment '订单编号' ")private String orderId;@Column(name="businessId",nullable=true,columnDefinition="VARCHAR(255)  comment '企业编号' ")private String businessId;@Column(name="goodsId",nullable=true,columnDefinition="VARCHAR(255)  comment '商品编号' ")private String goodsId;@Column(name="deviceId",nullable=true,columnDefinition="VARCHAR(255)  comment '设备编号' ")private String deviceId;@Column(name="number",nullable=true,columnDefinition="INT  comment '商品数量' ")private Integer number;@Column(name="price",nullable=true,columnDefinition="DECIMAL(10,2)  comment '订单金额' ")private BigDecimal price;@Column(name="refundPrice",nullable=true,columnDefinition="DECIMAL(10,2)  comment '退款金额' ")
}

Entity 常用注解

        指定对象与数据库字段映射时注解的位置:如@Id、@Column等注解指定Entity的字段与数据库字段对应关系时,注解的位置可以在Field(属性)或Property(属性的get方法上),两者统一用其中一种,不能两者均有。推荐用前者。

@Entity、@Table

@Entity(必需)

        标注在实体类上。

        映射实体类。指出该 Java 类为实体类,将映射到指定的关系数据库表。

        应用了此注解后,将会自动将类名映射作为数据库表名、将类内的字段名映射为数据库表的列名。映射策略默认是按驼峰命名法拆分将类名或字段名拆分成多部分,然后以下划线连接,如StudentEntity -> student_entity、studentName -> student_name。若不按默认映射,则可通过@Table@Column指定,见下面。

@Table(可选)

        标注在实体类上。

        映射数据库表名。当实体类与其映射的数据库表名不同名时需要使用 @Table 标注说明,该标注与 @Entity 标注并列使用

  • schema属性:指定数据库名
  • name属性:指定表名,不指定时默认按驼峰命名法拆分将类名,并以下划线连接

@Id、@GeneratedValue

@Id(必需)

        标注在实体类成员变量或getter方法之上。

        映射生成主键。用于声明一个实体类的属性映射为数据库的一个主键列。

        若同时指定了下面的 @GeneratedValue 则存储时会自动生成主键值,否则在存入前用户需要手动为实体赋一个主键值。

主键值类型可以是:

  • Primitive types:

    boolean, byte, short, char, int, long, float, double

  • Equivalent wrapper classes from package java.lang:

    Byte,Short, Character, Integer, Long, Float, Double

  • java.math.BigInteger, java.math.BigDecimal
  • java.lang.String
  • java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp
  • Any enum type
  • Reference to an entity object
  • composite of several keys above

指定联合主键,有@IdClass、@EmbeddedId两种方法。

@GeneratedValue

        @GeneratedValue 用于标注主键的生成策略,通过 strategy 属性指定。

        默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer 对应 identity,MySQL 对应 auto increment

  • AUTO: JPA自动选择合适的策略,是默认选项
  • IDENTITY:采用数据库 ID自增长的方式来自增主键字段,Oracle 不支持这种方式
  • TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
  • SEQUENCE:通过序列产生主键,通过 @SequenceGenerator 注解指定序列名,MySql 不支持这种方式

@Column、@Basic、@Transient

@Column(可选)

        标注在实体类成员变量或getter方法之上。

        映射表格列。当实体的属性与其映射的数据库表的列不同名时需要使用 @Column 标注说明。

        类的字段名在数据库中对应的字段名可以通过此注解的name属性指定,不指定则默认为将属性名按驼峰命名法拆分并以下划线连接,如 createTime 对应 create_time

        注意:即使name的值中包含大写字母,对应到db后也会转成小写,如@ Column(name="create_Time") 在数据库中字段名仍为create_time。可通过SpringBoot配置参数【spring.jpa.hibernate.naming.physical-strategy】配置对应策略,如指定name值是什么,数据库中就对应什么名字的列名。默认值为:【org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy】

@Column注解一共有10个属性,这10个属性均为可选属性,各属性含义分别如下:

  • name:定义了被标注字段在数据库表中所对应字段的名称。
  • unique:该字段是否为唯一标识,默认为false。也可以使用@Table标记中的@UniqueConstraint。
  • nullable:该字段是否可以为null值,默认为true。
  • length:字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。
  • insertable:在使用“INSERT”脚本插入数据时,是否插入该字段的值。默认为true。
  • updatable:在使用“UPDATE”脚本插入数据时,是否更新该字段的值。默认为true。

    insertable = false 和updatable = false 一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。

  • columnDefinition:建表时创建该字段的DDL语句,一般用于通过Entity生成表定义时使用。

    (如果DB中表已经建好,该属性没有必要使用)

  • precision和scale:表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。
  • table:定义了包含当前字段的表名。

@Basic(可选)

        表示一个简单的属性到数据表的字段的映射,对于没有任何标注的属性或 getter 方法,默认标注为 @Basic

  • fetch 表示属性的读取策略,有 EAGER 和 LAZY 两种,分别为立即加载和延迟加载
  • optional 表示该属性是否允许为 null,默认为 true

@Transient:忽略属性

        定义暂态属性。表示该属性并非一个到数据库表的字段的映射,ORM 框架将忽略该属性。

        如果一个属性并非数据库表的字段映射,就必须将其标识为 @Transient,否则ORM 框架默认为其注解 @Basic,例如工具方法不需要映射。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/55921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建osd加入集群

故障原因:ceph节点一个磁盘损坏,其中osd69 down了,需要更换磁盘并重新创建osd加入ceph集群。 信息采集: 更换磁盘前,查询osd69对应的盘符: 将对应的故障磁盘更换后,并重做raid,然后查…

ChatGPT相关参数示例

max_token 用于控制最大输出长度,若ChatGPT的回复大于max_tokens,则对输出结果进行截断。 from openai import OpenAI client OpenAI(base_url"https://api.chatanywhere.tech/v1" ) response client.chat.completions.create(model"…

超轻巧modbus调试助手使用说明

一、使用说明 1.1 数据格式 和其他的modbus采集工具一样,本组件也支持各种数据格式,其实就是高字节低字节的顺序。一般是2字节表示一个数据,后面又有4字节表示一个数据,目前好像还有8字节表示一个数据的设备。不同厂家的设备对应…

vue3+vant4+微信公众号实现图片上传和扫一扫功能

这里我只记录了js的实现过程 首先先安装weixin-js-sdk npm install weixin-js-sdk 处理JS-SDK配置&#xff0c;前提是已经从后端获取到了appId和openId <script setup> import { ref, onMounted } from "vue"; import { imageConfig } from "/api&quo…

C++ | Leetcode C++题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; class Solution { public:bool circularArrayLoop(vector<int>& nums) {int n nums.size();auto next [&](int cur) {return ((cur nums[cur]) % n n) % n; // 保证返回值在 [0,n) 中};for (int i 0; i < n; i) {if …

【论文速看】DL最新进展20241009-图像生成、多模态、医学扩散模型、行人重识别

目录 【图像生成】【多模态】【医学扩散模型】【行人重识别】 【图像生成】 [2024] CAR: Controllable Autoregressive Modeling for Visual Generation 论文链接&#xff1a;https://arxiv.org/pdf/2410.04671 代码链接&#xff1a;https://github.com/MiracleDance/CAR 可控…

torchvision.transforms.Resize()的用法

今天我在使用torchvision.transforms.Resize()的时候发现&#xff0c;一般Resize中放的是size或者是(size,size)这样的二元数。 这两个里面&#xff0c;torchvision.transforms.Resize((size,size))&#xff0c;大家都很清楚&#xff0c;会将图像的h和w大小都变成size。 但是…

Wasserstein距离

Wasserstein距离&#xff08;Wasserstein distance&#xff09;&#xff0c;又称为推土机移动距离&#xff08;Earth Mover’s Distance, EMD&#xff09;&#xff0c;是度量理论中用来比较两个概率分布之间差异的一种距离度量。它源自最优传输问题&#xff08;Optimal Transpo…

gpt为什么可以依据上下文来回答问题,依据的是什么原理

GPT 可以依据上下文回答问题&#xff0c;主要依据以下几个原理&#xff1a; Transformer 架构&#xff1a; 并行计算与长距离依赖处理&#xff1a;Transformer 架构摒弃了传统的递归神经网络和长短时记忆网络的序列依赖处理方式&#xff0c;具有并行计算的能力。它可以同时处理…

洞察AI趋势:智享AI直播,打造专属你的数字化直播AIGC系统!

洞察AI趋势&#xff1a;智享AI直播&#xff0c;打造专属你的数字化直播AIGC系统&#xff01; 在当今这个日新月异的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;已不再是遥不可及的未来科技&#xff0c;而是正深刻改变着我们生活、工作的每一个角落。其中&#xf…

[ROS2]解决PyQt5和sip的各种报错问题 stderr: qt_gui_cpp

前言 编译ros环境的时候遇到了qt_gui_cpp各种编译问题&#xff0c;但是鉴于网上解决方法基本没有&#xff0c;故记录下来帮助后来者。整篇文章总结下来就是一句话&#xff1a;PyQt5和sip安装过程或安装版本有问题&#xff0c;需要重新安装。 问题与解决方法 如果PyQt5你是正…

DAMA数据管理知识体系(第12章 元数据管理)

课本内容 12.1 引言 图12-1 语境关系图&#xff1a;元数据概念理解 元数据的信息范围很广&#xff0c;不仅包括技术和业务流程、数据规则和约束&#xff0c;还包括逻辑数据结构与物理数据结构等。它描述了数据本身&#xff08;如数据库、数据元素、数据模型&#xff09;&#x…

女性议题,正在成为喜综困境?

《脱口秀和Ta的朋友们》&#xff08;以下简称《脱友》&#xff09;与《喜剧之王单口季》&#xff08;以下简称《喜单》&#xff09;两档喜综的对垒&#xff0c;竟然意外走向了同一个落点&#xff1a;对女性视角的收割。 #杨笠 这是血肉在疯长的声音# #杨笠 不是敢说是不知道这…

滚雪球学MySQL[8.3讲]:数据库中的JSON与全文检索详解:从数据存储到全文索引的高效使用

全文目录&#xff1a; 前言8.3 JSON与全文检索1. JSON数据类型的使用1.1 JSON 数据类型概述1.2 JSON 数据的插入与查询1.3 JSON 常用函数与操作1.4 JSON使用的优缺点与性能考虑 2. 全文索引与全文检索2.1 全文索引概述2.2 全文检索的使用2.3 全文检索模式2.4 全文索引优化与性能…

react-问卷星项目(4)

项目实战 使用CSS 尽量不要使用内联CSS 内联style代码多&#xff0c;性能差&#xff0c;扩展性差外链css文件可复用代码&#xff0c;可单独缓存文件 元素内联style 和HTMl元素的style相似必须用JS写法&#xff0c;不能是字符串&#xff0c;里面必须是对象 <span style…

洛谷P5648

洛谷P5648 这题花了很长时间&#xff0c;是在线段树题单里找到的&#xff08; &#xff09;。有线段树做法&#xff0c;但是我感觉可能比倍增做法更难看懂。以后有空再看看吧。感觉线段树现在只会板子题&#xff0c;绿稍微难点可能就不会。 花了很久时间之后&#xff0c;就觉得…

【YOLO学习】YOLOv5口罩检测实战

文章目录 1. 环境配置2. 下载代码3. 安装库3.1 安装pytorch3.2 安装其他库 4. 测试5. 数据标注6. 模型训练6.1 一些修改6.2 训练 7. 界面可视化 1. 环境配置 1. 先参考其他文章安装 Anaconda 或者 Miniconda&#xff0c;我安装的是 Miniconda。 2. 更换国内源&#xff0c;以加快…

LLM详解

一 定义 Large Language Model&#xff0c;称大规模语言模型或者大型语言模型&#xff0c;是一种基于大量数据训练的统计语言模型&#xff0c;可用于生成和翻译文本和其他内容&#xff0c;以及执行其他自然语言处理任务&#xff08;NLP&#xff09;&#xff0c;通常基于深度神…

vue 的属性绑定

双大括号不能在 HTML attributes 中使用。想要响应式地绑定一个 attribute&#xff0c;应该使用 v-bind 指令。 <template> <div v-bind:class"boxClass" v-bind:id"boxId"> </div> </template><script> export default{da…

VNC轻松连接远程Linux桌面

Linux配置VNC&#xff08;以RedHat、CentOS为例&#xff09; 说明&#xff1a; Linux平台安装VNCServer Windows平台使用VNC-Viewer 1.在Linux平台安装VNCServer服务端软件包。 yum -y install vnc *vnc-server*2.修改VNCServer主配置文件 vi /etc/sysconfig/vncservers复制…