Hibernate将Enum枚举类型映射为Int类型(补充VARCHAR类型配置)

最近要用Hibernate做一个枚举类型的映射,在MySQL数据库中,hibernate的map文件中如果不配置枚举类型属性的type,那么hibernate会默认的将Enum类型映射为TinyBlob类型,这样就很尴尬了,似乎要多耗费很多的资源,去网上找了一下,有很多种解决办法

  1. 如果用的是annotation那么用@Enumerated(EnumType.STRING)直接可以映射为String类型
  2. 如果采用XML配置就没这么简单了,网上最多的方法是利用Hibernate提供的UserType但这样并不是最好的解决办法,还有一种更好的办法
      
package com.igalia.enumerates;  
public enum Status {    
     BUSY,    AVAILABLE; 
}  

package com.igalia.entities;  
class MyClass {    
    private Status status; 
    //getter and setter
} 

映射为int类型配置如下:
<class name="MyClass">    
    <id name="id">      
        <generator class="native"/>    
    </id>     
    <property name="status">       
        <type name="org.hibernate.type.EnumType">          
            <param name="enumClass">com.igalia.enumerates.Status</param>       
        </type>    
    </property>
</class> 

原文地址: http://blog.csdn.net/G_beginner/article/details/6579582

映射为VARCHAR类型配置如下(其中type=12,12是java.sql.Type中定义的Type.VARCHAR对应的整形值, 默认配置是4,也即Type.INTEGER类型):
<class name="MyClass">    
    <id name="id">      
        <generator class="native"/>    
    </id>     
    <property name="status">       
        <type name="org.hibernate.type.EnumType">          
            <param name="enumClass">com.igalia.enumerates.Status</param>          
            <param name="type">12</param>
        </type>    
    </property>
</class> 

注:type=12,默认保存到数据库中的是enum类型的具体类型名称,
也就是,如果new MyClass().setStatus(Status.BUSY); 那么实际保存的是字符串值"BUSY",而Status.AVAILABLE,则保存的字符串是:"AVAILABLE"。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值