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 ...
随机推荐
- marquee跑马灯效果的相关属性
介绍HTML设置滚动文字marquee的相关属性 ㈠文字滚动标签 设置文字滚动使用<marquee></marquee>标签,可以再标签里面设置字体的颜色,字号,字体大小等. ...
- sublime text怎么格式化PHP代码
手动安装: 可能由于各种原因,无法使用代码安装,那可以通过以下步骤手动安装Package Control: 1.点击Preferences > Browse Packages菜单 2.进入打开的 ...
- python27 错误汇总
一.TypeError: object of type 'NoneType' has no len() 解决的方法: 源代码:resp_data = None (None是一个空的对象) 修改后代码 ...
- 在spring官网上下载历史版本的spring插件,springsource-tool-suite
目前spring官网(https://spring.io/tools3/sts/all)上可下载的spring插件只有: ECLIPSE ARCHIVE SIZE 4.9.0 springsource ...
- Jmeter -- 同步定时器
作用: 模拟并发. 设置一个阀值(请求数量),当请求数达到这个阀值时,允许请求同时发出.例如:想测试一座桥的并发(忽略载重等其他因素,只考虑通过),那么并发的请求就是类似于多少辆车可同时通过桥,而车辆 ...
- Android Studio基本使用
1. 创建Android项目 1) Application name:应用名称,launcher界面显示的 2) Company Domain:公司域名(sprd.com) 3) ...
- C++入门经典-例2.2-使用格式输出函数printf
1:使用printf函数对不同类型变量进行输出,%符号,代表输出类型,\n代表换行,代码如下: // 2.2.cpp : 定义控制台应用程序的入口点. // #include "stdafx ...
- LeetCode 93. 复原IP地址(Restore IP Addresses)
题目描述 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135&qu ...
- leetcode 34在排序数组中查找元素的第一个和最后一个位置
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { ve ...
- flask url_for后没有带端口号
问题描述: 在本地运行flask项目,当运行到下面这句代码时,正常重定向 return redirect(url_for('.script_case')) 但项目布署到服务器之后,代码运行一这句话,却 ...