zoukankan      html  css  js  c++  java
  • SpringBoot 应用JPA中的一些知识点

    1、ManyToOne、OneToMany注解中的cascade

    【在一切开始之前,我要先告诉大家:慎用级联关系,不要随便给all权限操作。应该根据业务需求选择所需的级联关系。否则可能酿成大祸。切记】

    • CascadeType.PERSIST
      官方文档的说明:Cascade persist operation
      看到网上很多博客对这一枚举值的解释是:级联持久化(保存)操作(持久保存拥有方实体时,也会持久保存该实体的所有相关数据。)
      我的内心OS是:妈蛋。我也知道是级联persist操作啊关键是怎么操作啊。妈蛋。拥有方实体是个什么玩意儿,该实体又是个什么玩意儿。
      经过实践检验,我的理解是:给当前设置的实体操作另一个实体的权限。这个理解可以推广到每一个CascadeType。因此,其余CascadeType枚举值将不再一一详细解释。
      For example:
    public class Student {
        @ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.LAZY)
        private Set<Course> courses = new HashSet<>();
        //其他代码略。
    }
    

    可以看到,我们在上面的代码中给了Student对Course进行级联保存(cascade=CascadeType.PERSIST)的权限。此时,若Student实体持有的Course实体在数据库中不存在时,保存该Student时,系统将自动在Course实体对应的数据库中保存这条Course数据。而如果没有这个权限,则无法保存该Course数据。

    • CascadeType.REMOVE
      Cascade remove operation,级联删除操作。
      删除当前实体时,与它有映射关系的实体也会跟着被删除。
    • CascadeType.MERGE
      Cascade merge operation,级联更新(合并)操作。
      当Student中的数据改变,会相应地更新Course中的数据。
    • CascadeType.DETACH
      Cascade detach operation,级联脱管/游离操作。
      如果你要删除一个实体,但是它有外键无法删除,你就需要这个级联权限了。它会撤销所有相关的外键关联。
    • CascadeType.REFRESH
      Cascade refresh operation,级联刷新操作。
      假设场景 有一个订单,订单里面关联了许多商品,这个订单可以被很多人操作,那么这个时候A对此订单和关联的商品进行了修改,与此同时,B也进行了相同的操作,但是B先一步比A保存了数据,那么当A保存数据的时候,就需要先刷新订单信息及关联的商品信息后,再将订单及商品保存。(来自良心会痛的评论)
    • CascadeType.ALL
      Cascade all operations,清晰明确,拥有以上所有级联操作权限。

    @GeneratedValue注解中的strategy

    • TABLE:使用一个特定的数据库表格来保存主键。

      使用一个特定的数据库表格来保存主键,持久化引擎通过关系数据库的一张特定的表格来生成主键,这种策略的好处就是不依赖于外部环境和数据库的具体实现,在不同数据库间可以很容易的进行移植,但由于其不能充分利用数据库的特性,所以不会优先使用。该策略一般与另外一个注解一起使用@TableGenerator,@TableGenerator注解指定了生成主键的表(可以在实体类上指定也可以在主键字段或属性上指定),然后JPA将会根据注解内容自动生成一张表作为序列表(或使用现有的序列表)。如果不指定序列表,则会生成一张默认的序列表,表中的列名也是自动生成,数据库上会生成一张名为sequence的表(SEQ_NAME,SEQ_COUNT)。序列表一般只包含两个字段:第一个字段是该生成策略的名称,第二个字段是该关系表的最大序号,它会随着数据的插入逐渐累加。

    • SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。

      在某些数据库中,不支持主键自增长,比如Oracle,其提供了一种叫做"序列(sequence)"的机制生成主键。此时,GenerationType.SEQUENCE就可以作为主键生成策略。该策略的不足之处正好与TABLE相反,由于只有部分数据库(Oracle,PostgreSQL,DB2)支持序列对象,MYsql不支持序列,所以该策略一般不应用于其他数据库。类似的,该策略一般与另外一个注解一起使用@SequenceGenerator,@SequenceGenerator注解指定了生成主键的序列.然后JPA会根据注解内容创建一个序列(或使用一个现有的序列)。如果不指定序列,则会自动生成一个序列SEQ_GEN_SEQUENCE。

    • IDENTITY:主键由数据库自动生成(主要是自动增长型)

      此种主键生成策略就是通常所说的主键自增长,数据库在插入数据时,会自动给主键赋值,比如MySQL可以在创建表时声明"auto_increment" 来指定主键自增长。该策略在大部分数据库中都提供了支持(指定方法或关键字可能不同),但还是有少数数据库不支持,所以可移植性略差。使用自增长主键生成策略是只需要声明strategy = GenerationType.IDENTITY即可。

    • AUTO:主键由程序控制。

      把主键生成策略交给持久化引擎(persistence engine),持久化引擎会根据数据库在以上三种主键生成策略中选择其中一种。此种主键生成策略比较常用,由于JPA默认的生成策略就是GenerationType.AUTO,所以使用此种策略时.可以显式的指定@GeneratedValue(strategy = GenerationType.AUTO)也可以直接@GeneratedValue。

    支持的Id策略 数据库名称
    不支持GenerationType.SEQUENCE
    GenerationType.AUTO
    GenerationType.IDENTITY
    GenerationType.TABLE
    MySQL
    GenerationType.SEQUENCE
    GenerationType.AUTO
    不支持GenerationType.IDENTITY
    GenerationType.TABLE
    Oracle
    GenerationType.SEQUENCE
    GenerationType.AUTO
    GenerationType.IDENTITY
    GenerationType.TABLE
    都支持
    postgreSQL
    GenerationType.SEQUENCE
    GenerationType.AUTO
    GenerationType.IDENTITY
    GenerationType.TABLE
    都支持
    kingbase
  • 相关阅读:
    Entity Framework 学习 Code First(1)
    CLR via C# 读书笔记 运行时序列化
    Entity Framework 学习 Model First
    轻量级开发工具 SharpDevelop
    bit加载失败
    [Reminder] 影响EMIF16异步读写性能因素
    Field Alert: Initial Voltage Level Setting of CVDD rail power supplies
    PHP函数Imap电子邮件系统函数
    PHP函数PHP选项及相关信息函数
    PHP函数Soap函数
  • 原文地址:https://www.cnblogs.com/zepc007/p/12335940.html
Copyright © 2011-2022 走看看