2015-09-22

在 Hibernate hbm.xml 裡使用 enum 類型儲存資料

用 Annotation 習慣之後,遇到既有專案得用 hbm.xml 來設定 Mapping,還真是有點辛苦啊。

下面用簡單的 enum 來練習。
public enum Status {

  ENABLE, DISABLE;
  
}
如果什麼都不做,只是單純的用 property 設定。
<property name="status"/>
產生的 SQL 就是基本型。
status varbinary(255) null
但是最大的問題在於資料庫存的是 enum 的順序(在 Annotation 就是用 EnumType.ORDINAL),也就是 ENABLE 是 0,DISABLE 是 1。

這種作法有兩個缺點,第一個資料庫裡的 0 或 1 沒有任何意義,必須搭配程式才能知道 0 是 ENABLE,1 是 DISABLE;第二個缺點是 enum 裡的 ENABLE 或 DISABLE 不能改變順序,因為連帶會影響到資料庫。

那怎麼改用 EnumType.STRING 的方式儲存 enum 呢?

加上下面這段就可以了。
<property name="status" column="status" length="30">
 <type name="org.hibernate.type.EnumType">
  <param name="enumClass">idv.neil.enums.Status</param>
  <param name="type">12</param>
 </type>
</property>
得到的 SQL 沒多大改變,但是資料庫存的就已經是 ENANLE 或 DISABLE 了。
status varbinary(30) null
運氣很好的,接連兩個案子都得用 hbm.xml 打交道,就很開心的把一樣的 code 搬過去,怎不行了!
Exception in thread "main" org.hibernate.MappingException: Could not determine type for: org.hibernate.type.EnumType, for columns: [org.hibernate.mapping.Column(Status)]
 at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:266)
 at org.hibernate.mapping.Column.getSqlTypeCode(Column.java:138)
 at org.hibernate.mapping.Column.getSqlType(Column.java:182)
 at org.hibernate.mapping.Table.sqlCreateString(Table.java:394)
 at org.hibernate.cfg.Configuration.generateSchemaCreationScript(Configuration.java:848)
 at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:94)
 at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:61)
最後發現,前一案用的 Hibernate 版本是 3.6.10.Final,後一案用的是 3.2.5.ga,居然沒有 org.hibernate.type.EnumType,要去 Hibernate Annotation 裡找才有。
<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-oscache</artifactId>
 <version>3.6.10.Final</version>
</dependency>
所以最後加上 Hibernate Annotation 就好了。
<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate</artifactId>
 <version>3.2.5.ga</version>
</dependency>
<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-annotations</artifactId>
 <version>3.3.0.ga</version>
</dependency>
---
---
---

沒有留言:

張貼留言