上一篇介绍了mybatis字段映射枚举类型,这一篇给大家介绍一下hibernate字段怎么去映射枚举类型的(这只是一种参考方式,映射方法还有很多种)。

还是以上篇sku表为例,sku表里一个status_type字段为int类型。(这里是postgresql的脚本)

status_type int4 NULL

Java里面对应生成的枚举类为:

 public enum SkuStatusType implements DbEnum, LocalString {

     PRODUCT(0, false, "masterdata.skuStatus.product"),
BUYING(1, false, "masterdata.skuStatus.buying"),
SALE(2, false, "masterdata.skuStatus.sale"); private int dbConstant;
private String messageKey; private OrderState(int dbConstant, boolean hasBeenDispatched, String messageKey) {
this.dbConstant = dbConstant;
this.hasBeenDispatched = hasBeenDispatched;
this.messageKey = messageKey;
} @Override
public Integer getConstant() {
return this.dbConstant;
} @Override
public String messageKey() {
return this.messageKey;
}
}

接下来是和mybatis不同的地方,所写的工具类不一样,看一下为hibernate写的工具类:

 package com.lcc.core.domain;

 import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties; import org.hibernate.HibernateException;
import org.hibernate.usertype.ParameterizedType;
import org.hibernate.usertype.UserType;
import org.hibernate.util.ReflectHelper; import com.lcc.api.domain.DbEnum; public class DbEnumType implements UserType, ParameterizedType { private static final int[] SQL_TYPES = { Types.INTEGER }; private Class<? super Enum<?>> enumClass;
private Map<Integer, Object> constantMap = null; @Override
public int[] sqlTypes() {
return SQL_TYPES;
} @Override
@SuppressWarnings("rawtypes")
public Class returnedClass() {
return enumClass;
} @Override
public boolean equals(Object x, Object y) {
if (x == y) {
return true;
}
if (x == null || y == null) {
return false;
}
return x.equals(y);
} @Override
public int hashCode(Object x) {
return x.hashCode();
} @Override
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws SQLException {
Integer value = rs.getInt(names[0]);
if (rs.wasNull()) {
return null;
} else {
return getEnumConstant(value);
}
} private Object getEnumConstant(Integer value) {
if (constantMap == null) {
Map constantMap = new HashMap<Integer, Object>(); Object[] enumConstants = enumClass.getEnumConstants();
for (Object enumC : enumConstants) {
constantMap.put(((DbEnum) enumC).getConstant(), enumC);
}
this.constantMap = constantMap;
}
return constantMap.get(value);
} @Override
public void nullSafeSet(PreparedStatement st, Object value, int index) throws SQLException {
if (value == null) {
st.setNull(index, Types.INTEGER);
} else {
DbEnum e = (DbEnum) value;
st.setInt(index, e.getConstant());
}
} @Override
public Object deepCopy(Object value) {
if (value == null) {
return null;
} else {
return value;
}
} @Override
public boolean isMutable() {
return false;
} @Override
public Serializable disassemble(Object value) {
return (DbEnum) value;
} @Override
public Object assemble(Serializable cached, Object owner) {
return cached;
} @Override
public Object replace(Object original, Object target, Object owner) {
return original;
} @Override
@SuppressWarnings("unchecked")
public void setParameterValues(Properties parameters) {
String enumClassName = parameters.getProperty("enumClass");
try {
enumClass = ReflectHelper.classForName(enumClassName, this.getClass()).asSubclass(Enum.class);
if (!ReflectHelper.implementsInterface(enumClass, DbEnum.class)) {
throw new HibernateException("Enum does not implement DBEnum");
}
} catch (ClassNotFoundException exception) {
throw new HibernateException("Enum class not found", exception);
}
}
}

上面工具类里面的interface(DbEnum, LocalString)请参考上一篇mybatis里面的:http://www.cnblogs.com/cc-java/p/6593589.html

工具类写好了 接下来需要在对象里面注解属性(对象是基于annotations的):

    @NotNull
@Column(nullable = false)
@Index(name = "order_state_idx")
@Type(type = "com.lcc.core.domain.DbEnumType", parameters = {
@Parameter(name = "enumClass", value = "com.lcc.api.domain.enums.order.SkuStatusType") })
private SkuStatusType state;

到这里差不多hibernate字段映射枚举类型就完成了。

hibernate字段映射枚举类型的更多相关文章

  1. mybatis字段映射枚举类型

    在底层使用mybatis的时候,我们可能会需要把表里的字段映射到Java里面的枚举类,现总结下工作中的用法: sku表里一个status_type字段为int类型.(这里是postgresql的脚本) ...

  2. 关于hibernate字段映射@colunm出现的问题以及jpa驼峰大写转_小写的问题探究

    关于hibernate字段映射@colunm出现的问题以及jpa驼峰大写转_小写的问题探究2018年04月24日 15:47:26 守望dfdfdf 阅读数:735 标签: @colunmhibern ...

  3. MyBatis里字段到枚举类型的转换/映射

    一.简介 我们在用MyBatis里,很多时间有这样一个需求:bean里有个属性是枚举,在DB存储时我们想存的枚举的代号,从DB拿出来时想直接映射成目标枚举类型,也即代号字段与Java枚举类的相互类型转 ...

  4. Entlib DAAB映射枚举类型

    1. IRowMapper<UserDto> addressMapper = MapBuilder<UserDto> .MapAllProperties() .Map(p =& ...

  5. 【hibernate postgresql】注解@TypeDef/@Enumerated/数据库字段gender为枚举类型,从前台接受到实体后进行保存报错:org.postgresql.util.PSQLException: ERROR: column "gender" is of type gender but expression is of type character varying

    数据库字段gender为枚举类型,从前台接受到实体后进行保存报错:org.postgresql.util.PSQLException: ERROR: column "gender" ...

  6. hibernate字段名和属性

    字段名和属性名相同 Annotation:默认为@Basic 注意:如果在成员属性没有加入任何注解,则默认在前面加入了@Basic Xml中不用写column 字段名和属性名不同 Annotation ...

  7. ServiceStack.Ormlit sqlserver枚举类型映射字段类型为varchar

    请当枚举类型上面加上[Flags]特性就可以了.

  8. hibernate的映射类型

    hibernate的映射类型 hibernate MySQL映射类型 1.Hibernate的映射类型 hibernate mysql映射类型 Hibernate 映射类型 Java 类型 标准 SQ ...

  9. 攻城狮在路上(壹) Hibernate(十)--- 映射值类型集合

    一.映射Set(集):未排序,无重复. 实例代码: <set name="images" table="IMAGES" lazy="true&q ...

随机推荐

  1. C# TextBox 拖入数据 为路径

    1. 通过DragEnter事件获得被拖入窗口的“信息”(可以是若干文件,一些文字等等),在DragDrop事件中对“信息”进行解析. 2.接受拖放控件的AllowDrop属性必须设置成true; 3 ...

  2. Linux服务器pxe+kickstart部署无人值守安装

    一.    使用光盘镜像安装好一台Redhat6.8系统的虚拟机(图形化界面) 二.    部署相关服务程序 1.     安装并配置dhcpd服务程序 a)安装dhcp服务程序 b)对dhcp服务进 ...

  3. Apicloud_(接口验证)用户注册头部信息X-APICloud-AppKey生成

    接口验证KEY生成规则说明 官方文档: 传送门 "X-APICloud-AppKey"生成规则是基于SHA1()算法生成的 AppKey= SHA1(你的应用ID + 'UZ' + ...

  4. Redis的一点笔记

    Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 优势: 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s . 丰富 ...

  5. SpringMVC的 transferTo使用

    在开发Web应用程序时比较常见的功能之一,就是允许用户利用multipart请求将本地文件上传到服务器,而这正是Grails的坚固基石——SpringMVC其中的一个优势.Spring通过对Servl ...

  6. idea 编译内存溢出

    idea.max.intellisense.filesize=9999 idea.max.content.load.filesize=99999 idea.cycle.buffer.size=disa ...

  7. SpringBoot&Dubbo&Zookeeper远程调用项目搭建

    序言 Dubbo一款分布式服务框架,作为阿里巴巴SOA服务化治理方案的核心框架,通过高性能和透明化的RPC实现服务的远程调用,对服务的负载均衡以及项目的耦合性提供很强的解决方式;具体Dubbo的介绍和 ...

  8. leetcode 128最长连续序列

    方法一:使用快排: //排序法,时间O(nlogn),使用STL,只是验证一下思想,非正解: class Solution { public: int longestConsecutive(vecto ...

  9. iOS 的 Gif 渲染

    关于gif的展示,有些项目中很少用到,所以有的人对于这方面了解不是很多 下面介绍几种展示gif的方法,希望大家可以用得上,有更好的方法欢迎评论区留言 一,展示本地的gif,使用的SDWebImage里 ...

  10. MyBatis如何传入多个参数

    一.单个参数 mapper public List<Test> getTestList(String id); xml <select id = "getTestList& ...