@Column列定义使哪些属性变得冗余?

2022-08-31 15:55:43

我经常这样指定我的注释:@Column

@Column(columnDefinition="character varying (100) not null",length=100,nullable=false)

如您所见,我指定了这些,即使已经指定了这些。那是因为我不知道这些值的确切位置/时间。lengthnullablecolumnDefinition

那么,在指定 时,哪些其他属性是多余的呢?columnDefinition@Column

如果这很重要,我使用Hibernate和PostgreSQL。


答案 1

我的答案:以下所有内容都应该被覆盖(即,如果合适,在列定义中全部描述它们):

  • length
  • precision
  • scale
  • nullable
  • unique

即,DDL列将包含:+而不是其他任何内容namecolumndefinition

理由如下。


  1. 包含单词“Column”或“Table”的注释是纯物理的 - 属性仅用于控制针对数据库的DDL / DML。

  2. 其他纯逻辑注释 - 在java中的内存中使用属性来控制JPA处理。

  3. 这就是为什么有时可选性/可空性被设置两次的原因 - 一次通过,一次通过。前者说,在刷新时,JPA对象模型(内存中)中的属性/关联可以为空;后者表示 DB 列可以为空。通常,您希望它们设置相同 - 但并非总是如此,具体取决于数据库表的设置和重用方式。@Basic(...,optional=true)@Column(...,nullable=true)

在您的示例中,长度和可为 null 的属性被覆盖和冗余。


那么,在指定列定义时,@Column的哪些其他属性是冗余的呢?

  1. 在 JPA Spec & javadoc 中:

    • columnDefinition定义:为列生成 DDL 时使用的 SQL 片段。

    • columnDefinition默认值:生成 SQL 以创建推断类型的列。

    • 提供了以下示例:

      @Column(name="DESC", columnDefinition="CLOB NOT NULL", table="EMP_DETAIL")
      @Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
      
    • 而且,呃...,就是这样。:-$ ?!

    列定义是否会覆盖同一批注中提供的其他属性?

    javadoc 和 JPA 规范没有明确地解决这个问题 - 规范没有提供很好的保护。要 100% 确定,请使用您选择的实现进行测试。

  2. 从 JPA 规范中提供的示例可以安全地暗示以下内容

    • name & table 可以与 columnDefinition 结合使用,两者都不能被覆盖
    • 可为 null 被列重写/冗余定义
  3. 从“情况的逻辑”中可以相当安全地暗示以下内容(我刚刚说过吗?? :-P ):

    • 长度精度小数位数被定义覆盖/冗余 - 它们是类型中的组成部分
    • 可插入可更新是单独提供的,并且永远不会包含在列定义中,因为它们在将 SQL 生成引入数据库之前控制内存中的 SQL 生成。
  4. 这只剩下“”属性。它类似于 nullable - 扩展/限定类型定义,因此应将其视为类型定义的组成部分。即应该被覆盖。unique


测试我的答案对于列“A”和“B”,分别为:

  @Column(name="...", table="...", insertable=true, updateable=false,
          columndefinition="NUMBER(5,2) NOT NULL UNIQUE"

  @Column(name="...", table="...", insertable=false, updateable=true,
          columndefinition="NVARCHAR2(100) NULL"
  • 确认生成的表具有正确的类型/可空性/唯一性
  • (可选)执行 JPA 插入和更新:前者应包含列 A,后者应包含列 B

答案 2

columnDefinition 将覆盖休眠为此特定列生成的 sql DDL,它是不可移植的,取决于您使用的数据库。您可以使用它来指定可空值,长度,精度,小数位数...等。


推荐