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 ...
随机推荐
- 【java工具类】上传文件
/**上传文件 * @param file 文件 * @param filePath 上传文件路径,不包含文件名 * @param fileName 新的文件名 * @return 返回一个路径名 * ...
- [CF1204E]Natasha,Sasha and the Prefix Sums 题解
前言 本文中的排列指由n个1, m个-1构成的序列中的一种. 题目这么长不吐槽了,但是这确实是一道好题. 题解 DP题话不多说,直接状态/变量/转移. 状态 我们定义f表示"最大prefix ...
- 试用saucelabs进行浏览器兼容性测试
Hi,all 跟大家分享下saucelabs,一个云测试平台,支持PC和手机(自带的)浏览器的兼容性测试,并且支持selenium/appium的自动化测试,不过是收费的,价格还挺贵,但是人工的测试是 ...
- websocket协议解决消息发送问题 Could not decode a text frame as UTF-8.
在使用websocket 时出现了Could not decode a text frame as UTF-8 首次连接成功当发送消息时,出现了编码作错误 第一请求页面时,连接成功 当发送消息时,不加 ...
- JavaWeb_(SSH论坛)_三、用户模块
基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 User表 id ...
- Mongo rs
概念 rs中存储了每一次对mongo数据库的CUD操作,对rs的大小进行resize. 主要有两种方法: 在未开启过rs的情况下,修改配置文件 已使用rs一段时间后,发现rs太大,重新进行大小配置 启 ...
- ctf活动结果
签到题:flag{0ca175b9c0f726831d895e269332461} 解题过程:使用winhex打开图片,查询到ANSI ASCII 得到结果 1.SimCTF{hello simple ...
- 胜利点20191010-5 alpha week 1/2 Scrum立会报告+燃尽图 03
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/8747 一.小组情况组长:贺敬文组员:彭思雨 王志文 位军营 杨萍队名:胜 ...
- Docker非常详细的讲解
CSDN大牛写的,推荐 http://blog.csdn.net/tangtong1/article/details/53556129 阿里云docker镜像地址: https://dev.aliyu ...
- nohup及pip命令总结
最近在搭建Python的Web开发环境的时候,用到nohup和pip等一些工具,先简单总结一下,以备后续查用. 1.nohup nohup(no hang up)就是不挂断的意思,如果你正在运行一个进 ...