2013-04-18 44 views
34

我經常指定我@Column註釋是這樣的:@Column columnDefinition具有哪些屬性是多餘的?

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

正如你可以看到我指定lengthnullable即使columnDefinition已經指定了這些。那是因爲我不知道這些值的確切使用位置/時間。

因此,當指定columnDefinition時,@Column還有哪些其他屬性是多餘的?

如果它的事項,我使用Hibernate和PostgreSQL

+0

如果你打算指定它,那麼將在你的數據庫中創建確切的列,否則它將按照數據庫的默認值創建。 –

+2

我應該補充一點,我不再使用這個屬性,更喜歡做我自己的DDL。 –

回答

52

我的回答:以下所有應覆蓋(即描述它們都在columndefinition,如果合適的話):

  • length
  • precision
  • scale
  • nullable
  • unique

即列DDL將包括:name + columndefinition,沒有別的

理由如下。


  1. 包含單詞「列」或「表格」註解是純物理 - 僅用於控制DDL/DML針對數據庫屬性

  2. 其他註釋purely logical - 在java中用於控制JPA處理的內存中使用的屬性。

  3. 這就是爲什麼有時它會出現可選性/可空性設置兩次 - 一次通過@Basic(...,optional=true)和一次通過@Column(...,nullable=true)。前者說在沖洗時,JPA對象模型(內存中)中的屬性/關聯可以爲null;後者說DB列可以爲null。通常你會希望它們設置相同 - ,但並不總是,這取決於數據庫表的設置和重用方式。

在你的例子中,長度和可爲空的屬性被覆蓋和冗餘。


因此,指定columnDefinition的時候,有什麼@Column的其他屬性被裁員?

  1. 在JPA規格&的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,既不被覆蓋
    • nullable被覆蓋/冗餘以下通過columnDefinition
  3. 以下內容可以從「情況邏輯」中相當安全地暗示出來(我剛剛說過嗎? :-P):

    • lengthprecisionscale被覆蓋/由columnDefinition冗餘 - 它們是一體
    • insertableupdateable分開和從來沒有提供包括在columnDefinition的類型,因爲他們在內存中控制SQL生成,然後將其發送到數據庫。
  4. 只留下「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
5

columnDefinition將覆蓋由Hibernate這個特定列生成的SQL DDL,它是不可移動的,取決於你所使用的數據庫。您可以使用它來指定可爲空,長度,精度,比例等。

+0

我知道它是幹什麼的,它不是可移植的,但DDL代是唯一通常使用其他屬性('length','nullable'等)的地方嗎? –

+0

根據'javax.persistence.Column'的源代碼,屬性:'unique','nullable','columnDefinition','length','precision','scale'只用於DDL生成,屬性:'' name','table'用於指定列映射,屬性:'insertable','updatable'用於指定列是否包含在由持久性提供程序生成的SQL INSERT/UPDATE語句中。 – Septem