@Column columnDefinition有哪些属性可以实现冗余?

Bar*_*lom 46 java hibernate jpa

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

@Column(columnDefinition="character varying (100) not null",length=100,nullable=false)
Run Code Online (Sandbox Code Playgroud)

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

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

如果重要,我使用Hibernate和PostgreSQL

Gle*_*est 67

我的答案:以下所有内容都应该被覆盖(即在columndefinition适当的时候将其全部描述):

  • length
  • precision
  • scale
  • nullable
  • unique

即列DDL将包含:name+ columndefinition 和其他内容.

基本原理如下.


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

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

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

在您的示例中,length和nullable属性被覆盖并且是多余的.


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

  1. 在JPA Spec&javadoc中:

    • columnDefinitiondefinition: 为列生成DDL时使用的SQL片段.

    • columnDefinitiondefault: 生成的SQL以创建推断类型的列.

    • 提供以下示例:

      @Column(name="DESC", columnDefinition="CLOB NOT NULL", table="EMP_DETAIL")
      @Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
      
      Run Code Online (Sandbox Code Playgroud)
    • 而且,错误......,就是这样.: - $?!

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

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

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

    • name&table可以与之结合使用columnDefinition,也不会被覆盖
    • nullable 被覆盖/被多余 columnDefinition
  3. 从"情境逻辑"中可以相当安全地暗示以下内容(我只是说?? :-P):

    • length,precision,scale被覆盖/冗余由columnDefinition-它们是一体的类型
    • insertable并且updateable是单独提供的,并且从不包含在内columnDefinition,因为它们在将数据库发送到数据库之前控制内存中的SQL生成.
  4. 这只剩下" unique"属性.它类似于nullable - 扩展/限定类型定义,因此应该对类型定义进行整数处理.即应该被覆盖.


测试我的答案分别 为"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"
Run Code Online (Sandbox Code Playgroud)
  • 确认生成的表具有正确的类型/可空性/唯一性
  • 可选地,执行JPA插入和更新:前者应包括列A,后面的列B


Sep*_*tem 5

columnDefinition将覆盖hibernate为此特定列生成的sql DDL,它不可移植,取决于您使用的数据库.您可以使用它来指定可空,长度,精度,比例等.

  • 根据`javax.persistence.Column`源码,属性:`unique`、`nullable`、`columnDefinition`、`length`、` precision`、`scale`仅用于DDL生成,属性:`name `、`table` 用于指定列映射,属性:`insertable`、`updatable` 用于指定该列是否包含在持久化提供程序生成的 SQL INSERT/UPDATE 语句中。 (2认同)