2010-05-20 36 views
47

設置JPA中列的長度究竟做了什麼?在@Column JPA登錄中設置長度屬性時會做什麼?

@Column(name = "middle_name", nullable = false, length = 32) 
public String getMiddleName() { 
    return this.middleName; 
} 

據我所知,您可以使用註釋來生成基於實體對象的數據庫架構(DDL),但長度做任何類型的支票或截斷時持續發生,或者僅用於創建模式?

我也意識到,JPA可以坐在各種實現之上,在這種情況下我所關心的實現是Hibernate。

回答

67

發生持久性時長度是否做任何形式的檢查或截斷,還是僅用於模式創建?

Column註釋的length屬性用來指定:

列長度。 (僅在使用字符串值的列時適用。)

而且僅用於生成的DDL。在您的示例中,生成的列將生成爲VARCHAR(32)並嘗試插入更長的字符串將導致SQL錯誤。


進行驗證,你可以從Bean驗證API(JSR 303)添加@Size(max=32)constraint。我提供了一個可運行測試示例here

提供既Sizelength看起來是多餘的,但根據Bean驗證規範的Appendix D.,生成Bean驗證感知DDL不是強制的持久性提供。因此,使用length作爲DDL,@Size進行驗證。

如果您有興趣,只需在JPA 2.0的classpath中添加一個Bean Validation實現。有了JPA 1.0,請參閱此previous answer

+2

謝謝,我很懷疑。您是否碰巧有引用說明註釋僅適用於DDL?我無法在文檔中明確地找到它。 – 2010-05-20 18:08:16

+1

我試着使用'@Size(max = 32)'和'@Column(length = 128)',不幸的是'@ Size'似乎優先。也許這是一個Hibernate的bug。 – 2011-10-31 15:43:18

+1

例如,當我創建一個長度爲1500的列時,它在MySql中生成爲「TEXT」。尺寸限制在這種情況下如何適用?或者它適用於所有?謝謝。 – rpr 2012-09-17 12:15:42

3

@column(長度= 32)僅用於DDL用途,不用於限制意味着它允許超過32個字符,除非在表級別上不受限制。要限制大小,我們要遵循 @size(max = 32 )

2

順便說一句,如果你不設定長度,這將是在默認情況下(與MySQL測試255)

2

休眠4.3.11(和其他版本)時要注意驗證註解。 - 所以你也許不得不升級

這都是引述Hibernate 4.3.11 manual

Chapter 22.Additional modules

Hibernate的核心還提供了一些外部 模塊/項目的集成。這包括Hibernate Validator參考 Bean Validation(JSR 303)和Hibernate Search的實現。

Chapter 22.1 Bean Validation

... Hibernate和Bean驗證的集成工作在兩個 水平。首先,它能夠檢查內存中類的實例是否違反約束條件。其次,它可以將約束應用於Hibernate元模型,並將它們合併到生成的數據庫 模式中。 ...

Chapter 22.1.4 Database schema

Hibernate使用Bean驗證約束來產生一個精確的數據庫模式:

@NotNull leads to a not null column (unless it conflicts with components or table inheritance) 

@Size.max leads to a varchar(max) definition for Strings 

@Min, @Max lead to column checks (like value <= max) 

@Digits leads to the definition of precision and scale (ever wondered which is which? It's easy now with @Digits :)) 

注:@Lengh作品太像@Size


當您使用Hibernate Validator 5.1 - 那麼您還需要一個el-Implementation。例如

<dependency> 
    <groupId>org.glassfish.web</groupId> 
    <artifactId>el-impl</artifactId> 
    <version>2.2</version> 
</dependency> 

如果你沒有這個,則Hibernate ORM將未能啓動Hibernate的驗證,廣告因此不會採取(全部)JSR-303例如@Length,在帳戶@Size

相關問題