框架学习之JPA(二)

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

学习视频:尚硅谷框架jpa学习(有兴趣的同学留言邮箱)

使用软件:eclipse

Java版本:jdk8

本节目录

二、JPA_基本注解

1.基本的六个注解

@Entity

@Table

@Id

@GeneratedValue

@Column

@Basic

2.@Transient

3.@Temporal

4.用Table生成主键

二、JPA_基本注解

如果@Id注解放在get方法上面,默认找到其set方法然后才映射到数据库中,所有的get方法都会按照这个规则进行

如果@Id注解放在属性名上面,则默认会映射属性,无论会不会有get和set方法,所有的属性都会按照这个规则进行

注:我自己总结的规则,可能是错误的

1.基本的六个注解

@Entity

@Table

@Id

@GeneratedValue

@Column

@Basic

1)@Entity

  • @Entity标注用于实体类声明语句之前,指出该java类为实体类,将映射到指定的数据库表。

2)@Table

  • 当实体类与其映射的数据库表名不同名时需要使用@Table标注说明,该标注与@Entity并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明语句同行。如果不加@Table,默认表名为类名。
  • @Table标注的常用选项name,用于致命数据表的表名
  • @Table还有两个选项catalog和schema用于设置表所属的数据库目录或模式,通常为数据库名。uniqueConstraints选项用于设置约束条件,通常不设置。

3)@Id

  • @Id标注用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前,可与生命语句同行,也可以写在单独行上。
  • @Id标注也可以置于属性的getter方法之前。

4)@GeneratedValue

  • @GeneratedValue 用于标注主键生成策略,通过strategy属性指定。默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略:SqlServer对应identity,MySQL对应auto或者increment
  • 在javax.persistence.GenerationType定义了一下几种可供选择的策略:
    • IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle不支持这种方式
    • AUTO:JPA自动选择合适的策略,是默认选项
    • SEQUENCE:通过序列生成主键,通过@SequenceGenerator注解指定序列名,Mysql不支持这种方式
    • TABLE:通过表产生主键,框架借由表模拟序列产生主键使用该策略可以使应用更易于数据库移植

5)@Basic

  • @Basic表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxxx()方法。默认为@Basic
  • fetch:表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载,默认为EAGER。
  • Optional:表示该属性是否允许为null,默认为true

6)@Column

  • 当实体的属性与其映射的数据表的列名不同时需要使用,@Column注解说明,该属性通常置于实体的属性声明语句之前,还可以与@Id一起使用。
  • @Column标注的column常用属性是name,用于设置映射数据库表的列名,此外,该注解还包含其他多个属性,如:unique,nullable,length等。
  • @Column标注的columnDefinition属性:表示该字段在数据库中的实际类型,通常ORM框架可以根据属性类型自动判断数据库中的字段类型,但是对于Date类型仍无法确定数据库中字段类型究竟是Date,Time还是TimeStamp。此外,String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOB或者TEXT字段类型
  • @Column标注也可以置于属性的getter方法之前

2.@Transient

  • 表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性
  • 如果一个属性并非数据库表的字段映射,就务必将其标注为@Transient否则ORM框架默认其注解为@Basic

3.@Temporal

  • 在核心的Java API中没有定义Date类型的精度(temporal precision)。而在数据库中,表示Date类型的数据有DATE,TIME和TIMESTAMP三种精度(即单纯的日期,时间,或者两者兼备)。在进行属性映射时可以使用@Temporal注解来调整精度

4.用Table生成主键

通过其他的表的内容来生成主键ID,使用于所有的数据库,但是这个使用的几率很小

1)创建一个jpa_id_generators表

2)设置主键的标签(主键部分的java代码)

@Id

@GeneratedValue(strategy=GenerationType.TABLE,generator="ID_GENERATOR")

@TableGenerator(name="ID_GENERATOR",

table="jpa_id_generators",

pkColumnName="PK_NAME",

pkColumnValue="CUSTOMER_ID",

valueColumnName="PK_VALUE",

allocationSize=100)

private Integer id;

3)生成效果

两张表的数据都会进行修改

JPA学习(二、JPA_基本注解)的更多相关文章

  1. Spring Boot 项目学习 (二) MySql + MyBatis 注解 + 分页控件 配置

    0 引言 本文主要在Spring Boot 基础项目的基础上,添加 Mysql .MyBatis(注解方式)与 分页控件 的配置,用于协助完成数据库操作. 1 创建数据表 这个过程就暂时省略了. 2 ...

  2. JPA学习(五、JPA_二级缓存)

    框架学习之JPA(五) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 ...

  3. JPA学习(四、JPA_映射关联关系)

    框架学习之JPA(四) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 ...

  4. 一步步学习 Spring Data 系列之JPA(二)

    继上一篇文章对Spring Data JPA更深( )一步剖析. 上一篇只是简单的介绍了Spring Data JPA的简单使用,而往往在项目中这一点功能并不能满足我们的需求.这是当然的,在业务中查询 ...

  5. java自定义注解学习(二)_注解详解

    上篇文章,我们简单的实现了一个自定义注解,相信大家对自定义注解有了个简单的认识,这篇,这样介绍下注解中的元注解和内置注解 整体图示 内置注解 @Override 重写覆盖 这个注解大家应该经常用到,主 ...

  6. JPA学习(三、JPA_API)

    框架学习之JPA(三) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 ...

  7. JPA学习---第一节:JPA详解

    一.详解 JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据.他的出现主要是 ...

  8. Spring学习---JPA学习笔记

    用了一段时间的Spring,到现在也只是处于会用的状态,对于深入一点的东西都不太了解.所以决定开始深入学习Spring. 本文主要记录JPA学习.在学习JPA之前,需要了解一些ORM的概念. ORM概 ...

  9. SpringCloud学习(二):微服务入门实战项目搭建

    一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...

随机推荐

  1. python小游戏2

    import hashlib 过段时间会来解释下hashlib的源码(能力有限请大家谅解)#根据md5模块来加密密码 def pwd_md5(pwd): ''' 加密用户输入过来的密码 :param ...

  2. css 命名 有的加# ,有的加点 ,有的没加。请问下都在什么情况下用的?

    [nav{}]这样的样式是给特定的标签直接定义样式时使用的,这个样式名称是跟标签是相对应的,比如我要给<p></p>这个标签设置样式,那我就可以直接写:p{样式}就可以,但是这 ...

  3. poj1042(贪心+枚举)

    题目链接:https://vjudge.net/problem/POJ-1042 题意:给n个湖,给出每个湖第一次打捞时鱼的数量f[i],每单位时间鱼减少的数量d[i],从湖i到湖i+1用时t[i], ...

  4. document与Object的关系

    window与Objet 1. window.__proto__ === Window.prototype 2. window.__proto__.__proto__ === 窗口属性(WindowP ...

  5. [转载]Oracle之单引号与双引号

    一.单引号 1.引用一个字符串常量,也就是界定一个字符串的开始和结束 select * from t_sys_user where id='15'; --查询id为15的字符 select * fro ...

  6. 用python 获取照片的Exif 信息(获取拍摄设备,时间,地点等信息)

    第一步:先安装 pip install exifread 第二部:上代码 import exifread import requests class PhotoExifInfo(): def __in ...

  7. myql命令行乱码问题,以及设置数据库编码

    使用命令修改数据库编码格式参见:https://www.cnblogs.com/clsn/p/8047028.html#auto_id_3 命令行乱码设置修改参见:https://www.cnblog ...

  8. $id(id)函数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 【Java】 Java多线程(一)

    一.对线程的理解 1.线程概念 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行 ...

  10. 如何计算java程序运行花了多长时间。加时间戳。

    long start = System.currentTimeMillis(); // 记录起始时间 try { Thread.sleep(5000); // 线程睡眠5秒,让运行时间不那么小 } c ...