2011-04-09 44 views
10

對於簡單的字符串字段,JPA:我應該使用哪個?基本(可選)或列(可空)?

@Entity 
class Foo { 

    //1. @Basic(optional = false) 
    //2. @Column(length = 100, nullable = false) 
    String name; 
} 

我需要使用@Column註解來限制名字的長度,但我很困惑與可空屬性。雖然我使用的其他註釋類似@ManyToOne@OneToMany,但使用optional屬性,我希望使用@Basic(optional)來保持大多數註釋的統一。但是我不能用@Basic來限制名字的長度。

那麼,我應該在哪裏註釋可空屬性,由@Basic@Column

編輯

簡單的說,以何種形式,你會喜歡:

表1:

@Entity 
class Foo { 
    @Basic(optional = false) 
    @Column(length = 100) 
    String name; 
} 

表2:

@Entity 
class Foo { 
    @Column(length = 100, nullable = false) 
    String name; 
} 

嗯,我個人喜歡錶1,因爲optional屬性也被@ManyToOne等註解使用,但表單2也很好,因爲它是在單個註釋中完成的。

編輯

閱讀http://markmail.org/message/osod6rsauwbnkvya後,我有@Basic.optional@Column.nullable之間的差異。但我仍然不知道應該使用哪一個。包含兩個註釋似乎都很好,所以要使底層表格定義得更好,並且在實際更新之前檢查null可能稍微快一點。

+1

[@Basic(可選= false)vs @Column(nullable = false)在JPA]中的可能重複(http://stackoverflow.com/questions/2899073/basicoptional-false-vs-columnnullable-false-in- jpa) – rds 2013-06-18 09:34:58

回答

9

從API文檔:

@Basic:

@Basic註釋是 映射到數據庫列的最簡單的類型。所述 基本註釋可以應用於一個 持久性或實例的任何下列 類型的 變量:Java基本類型,包裝的原始類型的 ,字符串, java.math.BigInteger中, java.math.BigDecimal中,java.util.Date, java.util.Calendar,java.sql.Date, java.sql.Time,java.sql.Timestamp, byte [],Byte [],char [],Character [], 枚舉,以及 實現Serializable的任何其他類型。

@Column

@Column用來爲持久屬性或 字段中指定映射 列。如果未指定Column註釋 ,則應用默認值 。

所以,如果你沒有指定@Column它從getter/setter派生列值。 如果您需要指定列名稱,則必須註釋@Column

@Basic允許您指定提取類型。如果你想改變默認的抓取類型,你必須使用這個註解,否則你可以忽略它。

+3

查看http://stackoverflow.com/questions/2899073/basicoptional-false-vs-columnnullable-false-in-jpa – Reddy 2011-04-09 05:19:47

+0

@Reddy - 所以,只有'@ Basic'就像是說讓數據庫列'NOT NULL「的變量?那麼爲什麼有兩種方法來做同樣的事情呢? – 2014-05-10 00:13:31