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 ...
随机推荐
- [模板] KMP算法/Border
KMP 算法 KMP (Knuth-Morris-Pratt) 算法是一种在线性时间内匹配文本串和模式串的算法. 称字符串的 Border 集合为 \[ \operatorname {Border} ...
- 一些简单题(1)(Source : NOIP历年试题+杂题)
最近也写了些许题目吧,还是写写博客,捋捋思路. P2216 [HAOI2007]理想的正方形 求一个$a \times b(a,b \leq 10^3)$的矩阵,求出一个$n \times n (n ...
- js获取iframe里面的dom
最近在写页面遇到了问题,一个dom好多地方用到,然后我就单独写了个html页面,然后用iframe引入,但是,想获取iframe里面input的value,获取不到input,后面才知道原来js不能直 ...
- [NLP] The Annotated Transformer 代码修正
1. RuntimeError: "exp" not implemented for 'torch.LongTensor' class PositionalEncoding(nn. ...
- HomeBrew安装MongoDB如何启动
1.先安装HomeBrew 安装(需要 Ruby): ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/in ...
- C++入门经典-例3.3-if-else语句的奇偶性判别
1:代码如下: // 3.3.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...
- 事件源event.target
今天在了解检测浏览器是否能播放不同类型的视频时发现以下代码 <script> function supportType(e,vidType,codType) { myVid=documen ...
- spark MLlib 概念 1:相关系数( PPMCC or PCC or Pearson's r皮尔森相关系数) and Spearman's correlation(史匹曼等级相关系数)
皮尔森相关系数定义: 协方差与标准差乘积的商. Pearson's correlation coefficient when applied to a population is commonly r ...
- redis深度历险:核心原理与应用实践--笔记
- IJCAI 2019 Analysis
IJCAI 2019 Analysis 检索不到论文的关键词:retrofitting word embedding Getting in Shape: Word Embedding SubSpace ...