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

时间:2013-04-18 09:04:26

标签: java hibernate jpa

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

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

正如您所看到的,我指定了lengthnullable,即使columnDefinition已经指定了这些内容。那是因为我不知道这些值的确切使用位置/时间。

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

如果重要,我使用Hibernate和PostgreSQL

2 个答案:

答案 0 :(得分:65)

我的答案:以下所有内容都应该被覆盖(例如,如果合适,请在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。通常,您希望它们设置相同 - 但不总是,具体取决于数据库表的设置和重用方式。

  4. 在您的示例中,length和nullable属性被覆盖且冗余。


      

    那么,在指定columnDefinition时,@ 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")
        
      • 而且,错误......,就是这样。 : - $?!

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

      javadoc和JPA规范没有明确说明这一点 - 规范没有给予很好的保护。为了100%确定,请使用您选择的实施进行测试。

    2. JPA规范

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

      • lengthprecisionscalecolumnDefinition覆盖/变为多余 - 它们是类型的组成部分
      • insertableupdateable是单独提供的,并且从未包含在columnDefinition中,因为它们在将数据库发送到数据库之前控制内存中的SQL生成。
    4. 只留下“unique”属性。它类似于nullable - 扩展/限定类型定义,因此应该对类型定义进行整数处理。即应该被覆盖。


    5. 测试我的答案 对于“A”和“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

答案 1 :(得分:5)

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