2009-12-01 24 views
2

以下JPA列定義上的所有數據庫默認生成的「整數」數據類型(例如H2,MySQL和postgres的)就是hbm2ddl基於GenericEnumUserType

@Column(name = "type", nullable = false) 
@Type(type = "com.mycompany.hibernate.usertype.GenericEnumUserType", parameters = { 
     @Parameter(name = "enumClass", value = "com.mycompany.model.DegreeType"), 
     @Parameter(name = "identifierMethod", value = "toInt"), 
     @Parameter(name = "valueOfMethod", value = "fromInt") }) 
@NotNull 
private DegreeType type; 

我想用最少的存儲這個字段,因此會更喜歡使用schemaDedinition參數來生成schema2ddl。但看起來tinyint在postgres中不受支持,但在上面提到的其他數據庫中受支持。

是否有可能根據數據庫類型生成不同的SQL文件。 1.什麼是實現這個目標的最佳途徑? 2.什麼是可用於此目的的最佳數據類型(最小存儲空間)?請問這是小問題

回答

2

由於您使用的是自定義類型(爲什麼?),所以將根據您的類型的方法sqlTypes()的結果生成基礎列定義。實際的SQL列類型將從適當的Dialect獲得。

因此,如果sqlTypes()他們回來new int[] {Types.TINYINT},PostgreSQL的方言將其映射到int2和H2/MySQL來tinyint

所有這一切說,我會一般建議:

  1. 使用built-in enum support通過@Enumerated註解。
  2. 將枚舉值存儲爲字符串而不是整數。使用後者確實節省了一些空間,但它引入了一個巨大的潛在問題:下線3個月(年)有人通過在類型中插入另一個枚舉常量來更改代碼,並且突然所有數據都變爲無效。磁盤空間便宜;處理這樣的問題不是。

    @Enumerated(EnumType.STRING) 
    @Column(name = "degree_type", nullable = false, length=!0) 
    private DegreeType type; 
    
+0

感謝和感激的幫助,使得類型TINYINT的伎倆。順便說一句,我將枚舉存儲爲整數,因此這個抽象需要在GenericEnum之上。由於我的枚舉值是可本地化的,因此我不能使用將所有值存儲爲字符串的@Enumerated註釋 – Joe 2009-12-02 07:27:48

相關問題