hibernate字段映射枚举类型
上一篇介绍了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字段映射枚举类型的更多相关文章
- mybatis字段映射枚举类型
在底层使用mybatis的时候,我们可能会需要把表里的字段映射到Java里面的枚举类,现总结下工作中的用法: sku表里一个status_type字段为int类型.(这里是postgresql的脚本) ...
- 关于hibernate字段映射@colunm出现的问题以及jpa驼峰大写转_小写的问题探究
关于hibernate字段映射@colunm出现的问题以及jpa驼峰大写转_小写的问题探究2018年04月24日 15:47:26 守望dfdfdf 阅读数:735 标签: @colunmhibern ...
- MyBatis里字段到枚举类型的转换/映射
一.简介 我们在用MyBatis里,很多时间有这样一个需求:bean里有个属性是枚举,在DB存储时我们想存的枚举的代号,从DB拿出来时想直接映射成目标枚举类型,也即代号字段与Java枚举类的相互类型转 ...
- Entlib DAAB映射枚举类型
1. IRowMapper<UserDto> addressMapper = MapBuilder<UserDto> .MapAllProperties() .Map(p =& ...
- 【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" ...
- hibernate字段名和属性
字段名和属性名相同 Annotation:默认为@Basic 注意:如果在成员属性没有加入任何注解,则默认在前面加入了@Basic Xml中不用写column 字段名和属性名不同 Annotation ...
- ServiceStack.Ormlit sqlserver枚举类型映射字段类型为varchar
请当枚举类型上面加上[Flags]特性就可以了.
- hibernate的映射类型
hibernate的映射类型 hibernate MySQL映射类型 1.Hibernate的映射类型 hibernate mysql映射类型 Hibernate 映射类型 Java 类型 标准 SQ ...
- 攻城狮在路上(壹) Hibernate(十)--- 映射值类型集合
一.映射Set(集):未排序,无重复. 实例代码: <set name="images" table="IMAGES" lazy="true&q ...
随机推荐
- C# SqlDataReader
var reader = MSSQLHelper.ExecuteReader(sb.ToString(), out erro, ConnectionString); //SqlDataReader / ...
- 7、菜单栏、工具栏、状态栏、浮动窗口、TextEdit
新建项目,基类选择QMainWindow,不勾选ui mainwindow.cpp代码: #include "mainwindow.h" #include <QMenu ...
- Java多线程和并发(二),Thread中的start和run的区别
目录 1.调用run方法 2.调用start方法 3.start和run的区别 二.Thread中的start和run的区别 1.调用run方法 public class ThreadTest { p ...
- Vue组件使用
一.组件概念 有html模板,有css样式,有js逻辑的集合体 每一个组件都是一个vue实例 每个组件均具有自身的模板template,根组件的模板就是挂载点 每个组件模板只能拥有一个根标签 子组件的 ...
- Mongo Cursor
简介 在使用 Java 对数据库进行连接时,都会获取到一个 cursor ,cursor 实际指到的是我们查询数据库的query,而并不是 query 查询到的数据集. 此次在使用 mongo 的 c ...
- 使用Hive-JDBC遇到的一些问题解决
使用Hive-JDBC遇到的一些问题解决(转) 标签(空格分隔): Hive 1,java.lang.NoClassDefFoundError: org/apache/hive/service/cli ...
- EDA cheat sheet
%config InlineBackend.figure_format = 'svg' 在jupyter notebook中使用这个命令绘制更清晰的图像,注意百分号后不能有空格. 1. Univari ...
- Spring boot之使用thymeleaf
操作步骤 (1)在pom.xml中引入thymeleaf; (2)如何关闭thymeleaf缓存 (3)编写模板文件.html (4)编写访问模板文件controller 在pom.xml中引入thy ...
- C++入门经典-例2.11-流输出小数控制
1:代码如下: // 2.11.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...
- HashMap如何实现序列化
/** * Save the state of the <tt>HashMap</tt> instance to a stream (i.e., * serialize it) ...