Java @Column columnDefinition使哪些属性成为冗余?

Java @Column columnDefinition使哪些属性成为冗余?,java,hibernate,jpa,Java,Hibernate,Jpa,我经常这样指定我的@列注释: @Column(columnDefinition="character varying (100) not null",length=100,nullable=false) 如您所见,我指定了length和nullable,即使columnDefinition已经指定了它们。那是因为我不知道在哪里/什么时候确切地使用这些值 那么,在指定列定义时,@Column的哪些其他属性是多余的 如果重要的话,我使用Hibernate和PostgreSQL列定义将覆盖Hiber

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

@Column(columnDefinition="character varying (100) not null",length=100,nullable=false)
如您所见,我指定了
length
nullable
,即使
columnDefinition
已经指定了它们。那是因为我不知道在哪里/什么时候确切地使用这些值

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


如果重要的话,我使用Hibernate和PostgreSQL

列定义将覆盖Hibernate为此特定列生成的sql DDL,它是不可移植的,并且取决于您使用的数据库。您可以使用它来指定可为空、长度、精度、比例。。。等等。

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

  • 长度
  • 精度
  • 比例
  • nullable
  • unique
i、 e.列DDL将包括:
name
+
columndefinition
和其他内容

理由如下


  • 包含单词“Column”或“Table”的注释纯粹是物理属性,仅用于根据数据库控制DDL/DML

  • 其他注释纯粹是逻辑属性,在java内存中用于控制JPA处理

  • 这就是为什么有时会出现两次设置可选性/可空性的情况——一次通过
    @Basic(…,optional=true)
    设置,一次通过
    @Column(…,nullable=true)
    。前者表示,在刷新时,JPA对象模型(内存中)中的属性/关联可以为null;后者表示DB列可以为null。通常,您希望将它们设置为相同的,但并非总是如此,这取决于DB表的设置和重用方式

  • 在您的示例中,length和nullable属性被覆盖和冗余


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

  • 在JPA规范和javadoc中:

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

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

    • 提供了以下示例:

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

    columnDefinition是否覆盖同一注释中提供的其他属性?

    javadoc和JPA规范没有明确说明这一点——规范没有提供很好的保护。要100%确定,请使用您选择的实现进行测试

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

    • 名称
      &
      表格
      可与
      列定义
      结合使用,两者均不被覆盖
    • nullable
      columnDefinition
  • 从“形势逻辑”(我刚才说过吗?——p)中可以相当安全地暗示以下内容:

    • 长度
      精度
      比例
      列定义
      覆盖/冗余-它们是类型的组成部分
    • 可插入的
      可更新的
      是单独提供的,从不包含在
      列定义中,因为它们在将SQL写入数据库之前控制内存中的SQL生成。
  • 这只剩下“
    唯一的
    ”属性。它类似于nullable-扩展/限定类型定义,因此应该被视为类型定义的一部分。i、 e.应被覆盖


  • 测试我的答案 对于“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列

    如果要指定该属性,则将在数据库中创建确切的列,否则将按照数据库默认创建该列。我应该补充一点,我不再使用此属性,而是更喜欢使用自己的DDL。我知道它的功能,而且它不可移植,但DDL生成是其他属性的唯一位置吗(
    长度
    可为空
    等)是否通常使用?根据
    javax.persistence.Column
    的源代码,属性:
    unique
    nullable
    columnDefinition
    length
    precision
    scale
    仅用于DDL生成,属性:
    name
    table
    用于指定列n映射和属性:
    insertable
    updateable
    用于指定该列是否包含在持久性提供程序生成的SQL INSERT/UPDATE语句中。当该列已存在于数据库中且具有varchar(100)且我希望将其设为varchar(255)时,此注释是否有效?