下面用簡單的 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>---
---
---
沒有留言:
張貼留言