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

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

status_type int4 NULL

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

  1. public enum SkuStatusType implements DbEnum, LocalString {
  2.  
  3. PRODUCT(0, false, "masterdata.skuStatus.product"),
  4. BUYING(1, false, "masterdata.skuStatus.buying"),
  5. SALE(2, false, "masterdata.skuStatus.sale");
  6.  
  7. private int dbConstant;
  8. private String messageKey;
  9.  
  10. private OrderState(int dbConstant, boolean hasBeenDispatched, String messageKey) {
  11. this.dbConstant = dbConstant;
  12. this.hasBeenDispatched = hasBeenDispatched;
  13. this.messageKey = messageKey;
  14. }
  15.  
  16. @Override
  17. public Integer getConstant() {
  18. return this.dbConstant;
  19. }
  20.  
  21. @Override
  22. public String messageKey() {
  23. return this.messageKey;
  24. }
  25. }

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

  1. package com.lcc.core.domain;
  2.  
  3. import java.io.Serializable;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.sql.Types;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. import java.util.Properties;
  11.  
  12. import org.hibernate.HibernateException;
  13. import org.hibernate.usertype.ParameterizedType;
  14. import org.hibernate.usertype.UserType;
  15. import org.hibernate.util.ReflectHelper;
  16.  
  17. import com.lcc.api.domain.DbEnum;
  18.  
  19. public class DbEnumType implements UserType, ParameterizedType {
  20.  
  21. private static final int[] SQL_TYPES = { Types.INTEGER };
  22.  
  23. private Class<? super Enum<?>> enumClass;
  24. private Map<Integer, Object> constantMap = null;
  25.  
  26. @Override
  27. public int[] sqlTypes() {
  28. return SQL_TYPES;
  29. }
  30.  
  31. @Override
  32. @SuppressWarnings("rawtypes")
  33. public Class returnedClass() {
  34. return enumClass;
  35. }
  36.  
  37. @Override
  38. public boolean equals(Object x, Object y) {
  39. if (x == y) {
  40. return true;
  41. }
  42. if (x == null || y == null) {
  43. return false;
  44. }
  45. return x.equals(y);
  46. }
  47.  
  48. @Override
  49. public int hashCode(Object x) {
  50. return x.hashCode();
  51. }
  52.  
  53. @Override
  54. public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws SQLException {
  55. Integer value = rs.getInt(names[0]);
  56. if (rs.wasNull()) {
  57. return null;
  58. } else {
  59. return getEnumConstant(value);
  60. }
  61. }
  62.  
  63. private Object getEnumConstant(Integer value) {
  64. if (constantMap == null) {
  65. Map constantMap = new HashMap<Integer, Object>();
  66.  
  67. Object[] enumConstants = enumClass.getEnumConstants();
  68. for (Object enumC : enumConstants) {
  69. constantMap.put(((DbEnum) enumC).getConstant(), enumC);
  70. }
  71. this.constantMap = constantMap;
  72. }
  73. return constantMap.get(value);
  74. }
  75.  
  76. @Override
  77. public void nullSafeSet(PreparedStatement st, Object value, int index) throws SQLException {
  78. if (value == null) {
  79. st.setNull(index, Types.INTEGER);
  80. } else {
  81. DbEnum e = (DbEnum) value;
  82. st.setInt(index, e.getConstant());
  83. }
  84. }
  85.  
  86. @Override
  87. public Object deepCopy(Object value) {
  88. if (value == null) {
  89. return null;
  90. } else {
  91. return value;
  92. }
  93. }
  94.  
  95. @Override
  96. public boolean isMutable() {
  97. return false;
  98. }
  99.  
  100. @Override
  101. public Serializable disassemble(Object value) {
  102. return (DbEnum) value;
  103. }
  104.  
  105. @Override
  106. public Object assemble(Serializable cached, Object owner) {
  107. return cached;
  108. }
  109.  
  110. @Override
  111. public Object replace(Object original, Object target, Object owner) {
  112. return original;
  113. }
  114.  
  115. @Override
  116. @SuppressWarnings("unchecked")
  117. public void setParameterValues(Properties parameters) {
  118. String enumClassName = parameters.getProperty("enumClass");
  119. try {
  120. enumClass = ReflectHelper.classForName(enumClassName, this.getClass()).asSubclass(Enum.class);
  121. if (!ReflectHelper.implementsInterface(enumClass, DbEnum.class)) {
  122. throw new HibernateException("Enum does not implement DBEnum");
  123. }
  124. } catch (ClassNotFoundException exception) {
  125. throw new HibernateException("Enum class not found", exception);
  126. }
  127. }
  128. }

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

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

  1. @NotNull
  2. @Column(nullable = false)
  3. @Index(name = "order_state_idx")
  4. @Type(type = "com.lcc.core.domain.DbEnumType", parameters = {
  5. @Parameter(name = "enumClass", value = "com.lcc.api.domain.enums.order.SkuStatusType") })
  6. 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. marquee跑马灯效果的相关属性

    介绍HTML设置滚动文字marquee的相关属性 ㈠文字滚动标签 设置文字滚动使用<marquee></marquee>标签,可以再标签里面设置字体的颜色,字号,字体大小等. ...

  2. sublime text怎么格式化PHP代码

    手动安装: 可能由于各种原因,无法使用代码安装,那可以通过以下步骤手动安装Package Control: 1.点击Preferences > Browse Packages菜单 2.进入打开的 ...

  3. python27 错误汇总

    一.TypeError: object of type 'NoneType' has no len() 解决的方法: 源代码:resp_data = None  (None是一个空的对象) 修改后代码 ...

  4. 在spring官网上下载历史版本的spring插件,springsource-tool-suite

    目前spring官网(https://spring.io/tools3/sts/all)上可下载的spring插件只有: ECLIPSE ARCHIVE SIZE 4.9.0 springsource ...

  5. Jmeter -- 同步定时器

    作用: 模拟并发. 设置一个阀值(请求数量),当请求数达到这个阀值时,允许请求同时发出.例如:想测试一座桥的并发(忽略载重等其他因素,只考虑通过),那么并发的请求就是类似于多少辆车可同时通过桥,而车辆 ...

  6. Android Studio基本使用

    1.    创建Android项目 1)    Application name:应用名称,launcher界面显示的 2)    Company Domain:公司域名(sprd.com) 3)   ...

  7. C++入门经典-例2.2-使用格式输出函数printf

    1:使用printf函数对不同类型变量进行输出,%符号,代表输出类型,\n代表换行,代码如下: // 2.2.cpp : 定义控制台应用程序的入口点. // #include "stdafx ...

  8. LeetCode 93. 复原IP地址(Restore IP Addresses)

    题目描述 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135&qu ...

  9. leetcode 34在排序数组中查找元素的第一个和最后一个位置

    class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { ve ...

  10. flask url_for后没有带端口号

    问题描述: 在本地运行flask项目,当运行到下面这句代码时,正常重定向 return redirect(url_for('.script_case')) 但项目布署到服务器之后,代码运行一这句话,却 ...