Spring Data JPA 主键生成策略注解

末蓝、 2022-05-17 01:16 389阅读 0赞

在写项目时为数据库主键为varChar的主键配置时发现@GeneratedValue这个注解的配置完成不了MySQL数据库主键的序列化生成策略,所以去看了看这方便的资料发现还说的挺多的.

@GeneratedValue注解:

属于一个JPA接口(从JAVA EE 5开始,存在于javax.persistence包下),其接口下包含了两个抽象的参数,GenerationType类型的strategy和String类型的generator,并且两个参数都有相应的默认值。

其中stratgy属性的默认值有:

GenerationType是一个enum类

  • GeneratorType strategy

strategyGenerationType类型的枚举值,它的内容将指定 OpenJPA 容器自动生成实体标识的方式。strategy属性可以是下列枚举值:

  • GeneratorType.AUTO

    表示实体标识由 OpenJPA 容器自动生成,这也是 Strategy 属性的默认值。

  • GenerationType.IDENTITY

    OpenJPA 容器将使用数据库的自增长字段为新增加的实体对象赋唯一值,作为实体的标识。这种情况下需要数据库提供对自增长字段的支持,常用的数据库中,HSQL、SQL Server、MySQL、DB2、Derby 等数据库都能够提供这种支持。

  • GenerationType.SEQUENCE

    表示使用数据库的序列号为新增加的实体对象赋唯一值,作为实体的标识。这种情况下需要数据库提供对序列号的支持,常用的数据库中,Oracle、PostgreSQL 等数据库都能够提供这种支持。

  • GenerationType.TABLE

    表示使用数据库中指定表的某个字段记录实体对象的标识,通过该字段的增长为新增加的实体对象赋唯一值,作为实体的标识。

格式:

  1. @Id
  2. @GeneratedValue(strategy = GenerationType.SEQUENCE)
  3. /** 类目id */
  4. private Integer categoryId;

generator属性:

  • String generator

    generator属性中定义实体标识生成器的名称。如果实体的标识自动生成策略不是 GenerationType.AUTO或者 GenerationType.IDENTITY,就需要提供相应的 @SequenceGenerator或者 @TableGenerator注释还有@GenericGenerator注解,然后将 generator属性值设置为注释的 name属性值。

  • @javax.persistence.SequenceGenerator

    如果实体标识的自动生策略是 GenerationType.SEQUENCE,开发者需要为实体标识字段提供 SequenceGenerator注释,它的参数描述了使用序列号生成实体标识的具体细节。该注释支持以下四个属性:

  1. **表 1. SequenceGenerator 注释属性说明**
  2. <table>
  3. <tbody>
  4. <tr>
  5. <th>属性</th>
  6. <th>说明</th>
  7. </tr>
  8. <tr>
  9. <td><code>name</code></td>
  10. <td>该属性是必须设置的属性,它表示了 <code>SequenceGenerator</code>注释在 OpenJPA 容器中的唯一名称,将会被 <code> GeneratedValue</code>注释的 <code>generator</code>属性使用。将实体标识的自动生成委托给数据库的序列号特性时,实体标识字段的 <code>GeneratedValue</code>注释的 <code>generator</code>属性的值必须和某个 <code>SequenceGenerator</code>注释的 <code>name</code>属性值保持一致。</td>
  11. </tr>
  12. <tr>
  13. <td><code>sequenceName</code></td>
  14. <td>实体标识所使用的数据库序列号的名称。该属性是可选的,如果我们没有为该属性设置值,OpenJPA 框架将自动创建名为 <code>OPENJPA_SEQUENCE</code>的序列号。如果一个 OpenJPA 容器中管理的多个实体都选择使用序列号机制生成实体标识,而且实体类中都没有指定标识字段的 <code>sequenceName</code>属性,那么这些实体将会共享系统提供的默认名为 <code>OPENJPA_SEQUENCE</code>的序列号。这可能引起实体类编号的不连续。我们可以用下面的这个简单例子说明这种情况:假设 OpenJPA 容器中存在两个实体类 Dog 和 Fish,它们的实体标识字段都是数值型,并且都选择使用序列号生成实体标识,但是实体类中并没有提供 <code>sequenceName</code>属性值。当我们首先持久化一个 Dog 对象时,它的实体标识将会是 1,紧接着我们持久化一个 Fish 对象,它的实体标识就是 2,依次类推。</td>
  15. </tr>
  16. <tr>
  17. <td><code>initialValue</code></td>
  18. <td>该属性设置所使用序列号的起始值。</td>
  19. </tr>
  20. <tr>
  21. <td><code>allocationSize</code></td>
  22. <td>一些数据库的序列化机制允许预先分配序列号,比如 Oracle,这种预先分配机制可以一次性生成多个序列号,然后放在 cache 中,数据库用户获取的序列号是从序列号 cache 中获取的,这样就避免了在每一次数据库用户获取序列号的时候都要重新生成序列号。<code>allocationSize</code>属性设置的就是一次预先分配序列号的数目,默认情况下 <code>allocationSize</code>属性的值是 50。</td>
  23. </tr>
  24. </tbody>
  25. </table>
  26. @javax.persistence.TableGenerator
  27. 如果实体标识的自动生策略是 GenerationType.TABLE,开发者需要为实体标识字段提供 TableGenerator 注释,它的参数描述了使用数据库表生成实体标识的具体细节。该注释支持下列属性:
  28. **表 2. TableGenerator 注释属性说明**
  29. <table>
  30. <tbody>
  31. <tr>
  32. <th>属性</th>
  33. <th>说明</th>
  34. </tr>
  35. <tr>
  36. <td><code>name</code></td>
  37. <td>该属性是必须设置的属性,它表示了 <code>TableGenerator</code>注释在 OpenJPA 容器中的唯一名称,将会被 <code>GeneratedValue</code>注释的 <code>generator</code>属性所使用。将实体标识的自动生成委托给数据库表时,实体标识字段的 <code>GeneratedValue</code>注释的 <code>generator</code>属性的值必须和某个 <code>TableGenerator</code>注释的 <code>name</code>属性值保持一致。</td>
  38. </tr>
  39. <tr>
  40. <td><code>table</code></td>
  41. <td>该属性设置的是生成序列号的表的名称。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认的表名 <code>OPENJPA_SEQUENCES_TABLE</code>。</td>
  42. </tr>
  43. <tr>
  44. <td><code>schema</code></td>
  45. <td>该属性设置的是生成序列号的表的 schema。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会默认使用当前数据库用户对应的 schema。</td>
  46. </tr>
  47. <tr>
  48. <td><code>catalog</code></td>
  49. <td>该属性设置的是生成序列号的表的 catalog。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认当前数据库用户对应的 catalog。</td>
  50. </tr>
  51. <tr>
  52. <td><code>pkColumnName</code></td>
  53. <td>该属性设置的是生成序列号的表中的主键字段的名称,该字段将保存代表每个实体对应的标识值对应的特征字符串。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 <code>ID</code>。</td>
  54. </tr>
  55. <tr>
  56. <td><code>valueColumnName</code></td>
  57. <td>该属性设置的是生成序列号的表中记录实体对应标识最大值的字段的名称。该属性并不是必须设置的属性,如果开发者没有为该 属性设置值,OpenJPA 容器将会使用默认值 <code>SEQUENCE_VALUE</code>。</td>
  58. </tr>
  59. <tr>
  60. <td><code>pkColumnValue</code></td>
  61. <td>该属性设置的是生成序列号的表中的主键字段的特征字符串值 ( 比如 customID ),该字段将保存代表每个实体对应的标识值对应的特征字符串。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 <code>DEFAULT</code>。可以为多个实体设置相同的 <code>pkColumnValue</code>属性值,这些实体标识的生成将通过同一列的值的递增来实现。</td>
  62. </tr>
  63. <tr>
  64. <td><code>initialValue</code></td>
  65. <td>该属性设置的是生成序列号的表实体标识的初始值。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 0 。</td>
  66. </tr>
  67. <tr>
  68. <td><code>allocationSize</code></td>
  69. <td>为了降低标识生成时频繁操作数据库造成 的性能上的影响,实体标识生成的时候会一次性的获取多个实体标识,该属性设置的就是一次性获取实体标识的数目。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 50 。</td>
  70. </tr>
  71. </tbody>
  72. </table>

@org.hibernate.annotations.GenericGenerator

@GenericGenerator注解是hibernate所提供的自定义主键生成策略生成器,由@GenericGenerator实现多定义的策略。所以,它要配合@GeneratedValue一起使用,并且@GeneratedValue注解中的”generator”属性要与@GenericGenerator注解中name属性一致,strategy属性表示hibernate的主键生成策略.

@GenericGenerator支持13种策略,分别是(strategy属性取值):

  1. static {
  2. GENERATORS.put("uuid", UUIDHexGenerator.class);
  3. GENERATORS.put("hilo", TableHiLoGenerator.class);
  4. GENERATORS.put("assigned", Assigned.class);
  5. GENERATORS.put("identity", IdentityGenerator.class);
  6. GENERATORS.put("select", SelectGenerator.class);
  7. GENERATORS.put("sequence", SequenceGenerator.class);
  8. GENERATORS.put("seqhilo", SequenceHiLoGenerator.class);
  9. GENERATORS.put("increment", IncrementGenerator.class);
  10. GENERATORS.put("foreign", ForeignGenerator.class);
  11. GENERATORS.put("guid", GUIDGenerator.class);
  12. GENERATORS.put("uuid.hex", UUIDHexGenerator.class); //uuid.hex is deprecated
  13. GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class);
  14. }

格式: (下面代码是使用系统时间生成uuid)

  1. @Id
  2. @GeneratedValue(generator = "system-uuid")
  3. @GenericGenerator(name = "system-uuid",strategy = "uuid")
  4. /** 订单id */
  5. private String orderId;

相关知识博客:

LINK: http://www.cnblogs.com/tobeprogramer/p/4162228.html

LINK: http://www.cnblogs.com/ph123/p/5692194.html

发表评论

表情:
评论列表 (有 0 条评论,389人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JPA生成策略

    @GeneratedValue  用于标注主键的生成策略,通过 strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer

    相关 JPA 配置UUID生成策略

    > 我们知道oracle 有一种主键生成策略是UUID, 用于生成一个不重复的字符串做为主键. 使用UUID 作为主键可以防止恶意猜测主键, 对数据做非法操作. Hiberna