在有些时候 我们可能序列化存储对象为字符串形式,比如会话序列化存储到数据库。(当然数据量小没问题 大了还是存如memcached这种缓存中)。
具体代码:
/** * Copyright (c) 2005-2012 https://github.com/zhangkaitao * * Licensed under the Apache License, Version 2.0 (the "License"); */ package com.sishuok.es.common.repository.hibernate.type; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Maps; import org.apache.commons.codec.binary.Hex; import org.apache.shiro.web.util.SavedRequest; import org.hibernate.HibernateException; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.usertype.UserType; import java.io.*; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import java.util.HashMap; import java.util.Map; /** * Object序列化/反序列化 * 数据库中以hex字符串存储 * 参考http://jinnianshilongnian.iteye.com/blog/1497791 * <p>User: Zhang Kaitao * <p>Date: 13-3-20 下午4:46 * <p>Version: 1.0 */ public class ObjectSerializeUserType implements UserType, Serializable { @Override public int[] sqlTypes() { return new int[] {Types.VARCHAR}; } @Override public Class returnedClass() { return Object.class; } @Override public boolean equals(Object o, Object o1) throws HibernateException { if (o == o1) { return true; } if (o == null || o == null) { return false; } return o.equals(o1); } @Override public int hashCode(Object o) throws HibernateException { return o.hashCode(); } /** * 从JDBC ResultSet读取数据,将其转换为自定义类型后返回 * (此方法要求对克能出现null值进行处理) * names中包含了当前自定义类型的映射字段名称 * @param names * @param owner * @return * @throws HibernateException * @throws SQLException */ @Override public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException { ObjectInputStream ois = null; try { String hexStr = rs.getString(names[0]); ois = new ObjectInputStream(new ByteArrayInputStream(Hex.decodeHex(hexStr.toCharArray()))); return ois.readObject(); } catch (Exception e) { throw new HibernateException(e); } finally { try { ois.close(); } catch (IOException e) { } } } /** * 本方法将在Hibernate进行数据保存时被调用 * 我们可以通过PreparedStateme将自定义数据写入到对应的数据库表字段 */ @Override public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException { ObjectOutputStream oos = null; if(value == null) { st.setNull(index, Types.VARCHAR); } else { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(bos); oos.writeObject(value); oos.close(); byte[] objectBytes = bos.toByteArray(); String hexStr = Hex.encodeHexString(objectBytes); st.setString(index, hexStr); } catch (Exception e) { throw new HibernateException(e); } finally { try { oos.close(); } catch (IOException e) { } } } } /** * 提供自定义类型的完全复制方法 * 本方法将用构造返回对象 * 当nullSafeGet方法调用之后,我们获得了自定义数据对象,在向用户返回自定义数据之前, * deepCopy方法将被调用,它将根据自定义数据对象构造一个完全拷贝,并将此拷贝返回给用户 * 此时我们就得到了自定义数据对象的两个版本,第一个是从数据库读出的原始版本,其二是我们通过 * deepCopy方法构造的复制版本,原始的版本将有Hibernate维护,复制版由用户使用。原始版本用作 * 稍后的脏数据检查依据;Hibernate将在脏数据检查过程中将两个版本的数据进行对比(通过调用 * equals方法),如果数据发生了变化(equals方法返回false),则执行对应的持久化操作 * * @param o * @return * @throws HibernateException */ @Override public Object deepCopy(Object o) throws HibernateException { if(o == null) return null; return o; } /** * 本类型实例是否可变 * @return */ @Override public boolean isMutable() { return true; } /* 序列化 */ @Override public Serializable disassemble(Object value) throws HibernateException { return ((Serializable)value); } /* 反序列化 */ @Override public Object assemble(Serializable cached, Object owner) throws HibernateException { return cached; } @Override public Object replace(Object original, Object target, Object owner) throws HibernateException { return original; } }
1、deepCopy 直接返回我们的对象 因为我们修改会话后会直接update下 所以此处没必要复制
2、Hex.encodeHexString 我们把数据保存成16进制形式
使用代码:
@Type(type = "com.sishuok.es.common.repository.hibernate.type.ObjectSerializeUserType") private OnlineSession session;
相关推荐
1.4 Hibernate自定义类型 对象--->序列化为字符串 存储 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 1.5 Hibernate自定义类型 集合--->字符串 存储 . . . . . . . . . . . . . . ....
序列化为字符串 存储 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .48 1.5 Hibernate自定义类型 集合--->字符串 存储 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....
Hibernate.jar包,Hibernate可以应用在任何使用JDBC的场合,包含 hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-...
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
06 开源框架 Struts 1.x --> AJAX --> ECSide报表组件 --> Hibernate --> Spring --> Struts 2.0 --> AJAX框架(DWR、JSON、JQuery) 07 XML 基础语法 --> 解析(DOM/SAX/JDOM) 08 分布式开发 RMI --> EJB 3.0 --> ...
hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码 hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码
hibernatetools-Update-4.1.1.zip
Eclipse中Hibernate插件。
Eclipse用于Hibernate框架开发插件,全CSDN最低资源分下载,让你吃上真正的石灰。。。
hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate-jpa-2.1-api-1.0.0.final.jar.zip,内含hibernate-jpa-2.1-api-1.0.0.final.jar
Hibernate稳定版(hibernate-release-5.3.23.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。
hibernate-commons-annotations-5.0.1.Final.jar的源码
hibernate-jpa-2.1-api-1.0.0.Final.jar官方下载,请放心使用
hibernate many-to-many级联保存,级联更新,级联删除
hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码
hibernate-release-5.0.7.Final压缩包 -document -lib -project 内部Hibernate依赖库: antlr-2.7.7.jar dom4j-1.6.1.jar geronimo-jta_1.1_spec-1.1.1.jar hibernate-commons-annotations-5.0.1.Final.jar ...
spring-hibernate-dwr做的AJAX操作CRUD实例<br>环境:myeclipse6.0+jdk1.6<br>所需lib列表,请自行加入<br>mysql-connector-java-3.1.7-bin.jar<br>antlr-2.7.6rc1.jar<br>asm-attrs.jar<br>cglib-2.1.3.jar<br>...
NULL 博文链接:https://zhouxianglh.iteye.com/blog/569471