`
skzr.org
  • 浏览: 362807 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

[经验][hibernate][自定义类型]hibernate 3.6.3中自定义类型,json类型

    博客分类:
  • J2EE
阅读更多

首先感谢您百忙之中的阅读 :)

下面进入正题

 

在3.6.3中UserType已经过时了,所以直接实现接口Type

使用jackson json实现的,希望可以交流相关的实现。

对于月表hibernate是不是也能实现crud?期待您的交流

  1. 数据库:
    create table TEST (
    	id int,
    	json1 varchar(100),
    	json2 varchar(100)
    ) engine = innodb comment 'test';
     
  2. 类型定义:
    public class Test {
    	/** 标识 */
    	private Integer id;
    	private JsonNode json1;
    	private JsonNode json2;
    	...
    }
    重点在这个类JsonNodeType 
    public class JsonNodeType extends AbstractType {
    	private static final long serialVersionUID = 1L;
    	protected static transient ILocalLogger logger = LocalLoggerFactory.getLogger(JsonNodeType.class);
    
    	@Override
    	public int[] sqlTypes(Mapping mapping) {
    		return new int[] {StringType.INSTANCE.sqlType()};
    	}
    
    	@Override
    	public int getColumnSpan(Mapping mapping) {
    		return 1;
    	}
    
    	@Override
    	public Class<JsonNode> getReturnedClass() {
    		return JsonNode.class;
    	}
    
    	@Override
    	public boolean isDirty(Object oldState, Object currentState, boolean[] checkable, SessionImplementor session) {
    		return !isSame(oldState, currentState, session.getEntityMode());
    	}
    
    	@Override
    	public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws SQLException {
    		return nullSafeGet(rs, names[0], session, owner);
    	}
    
    	@Override
    	public Object nullSafeGet(ResultSet rs, String name, SessionImplementor session, Object owner) throws SQLException {
    		return toJsonNode(StringType.INSTANCE.nullSafeGet(rs, name, session));
    	}
    
    	@Override
    	public void nullSafeSet(PreparedStatement st, Object value, int index, boolean[] settable, SessionImplementor session) throws SQLException {
    		StringType.INSTANCE.nullSafeSet(st, toJsonStr(value), index, settable, session);
    	}
    
    	@Override
    	public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws SQLException {
    		StringType.INSTANCE.nullSafeSet(st, toJsonStr(value), index, session);
    	}
    
    	@Override
    	public void setToXMLNode(Node node, Object value, SessionFactoryImplementor factory) {
    		StringType.INSTANCE.setToXMLNode(node, toJsonStr(value), factory);
    	}
    
    	@Override
    	public String toLoggableString(Object value, SessionFactoryImplementor factory) {
    		return StringType.INSTANCE.toLoggableString(toJsonStr(value), factory);
    	}
    
    	@Override
    	public Object fromXMLNode(Node xml, Mapping factory) {
    		return StringType.INSTANCE.fromXMLNode(xml, factory);
    	}
    
    	@Override
    	public String getName() {
    		return "jsonNode";
    	}
    
    	@Override
    	public Object deepCopy(Object value, EntityMode entityMode, SessionFactoryImplementor factory) {
    		return value == null ? null : toJsonNode(value.toString());
    	}
    	
    	@Override
    	public boolean isMutable() {
    		return false;
    	}
    
    	@Override
    	public Object replace(Object original, Object target, SessionImplementor session, Object owner, @SuppressWarnings("rawtypes") Map copyCache) {
    		if (original == null) return null;
    		if (original.equals(target)) return target;
    		return toJsonNode(original.toString());
    	}
    
    	@Override
    	public boolean[] toColumnNullness(Object value, Mapping mapping) {
    		return StringType.INSTANCE.toColumnNullness(value, mapping);
    	}
    }
    
    
    /** json操作 */
    	public static final ObjectMapper JSON_MAPPER = new ObjectMapper();
    	static {
    		JSON_MAPPER.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false);
    		JSON_MAPPER.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
    		JSON_MAPPER.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
    	}
    	/**
    	 * json对象转化为字符串
    	 * @param value json对象
    	 * @return
    	 */
    	public static String toJsonStr(Object value) {
    		try {
    			return JSON_MAPPER.writeValueAsString(value);
    		} catch (IOException e) {
    			throw new IllegalArgumentException(logger.getText(I10NFramework.convertJsonFail, value), e);
    		}
    	}
    	
    	/**
    	 * String转化为JsonNode对象
    	 * @param value
    	 * @return JsonNode
    	 */
    	public static JsonNode toJsonNode(String value) {
    		try {
    			return value == null ? null : JSON_MAPPER.readValue(value, JsonNode.class);
    		} catch (IOException e) {
    			throw new IllegalArgumentException(logger.getText(I10NFramework.convertJsonFail, value), e);
    		}
    	}
     
  3. hbm配置:
    	<class name="Test" table="TEST">
    		<id name="id"/>
    		<property name="json1" type="jsonNode"/>
    		<property name="json2" type="jsonNode"/>
    	</class>
     
  4. spring配置:typeDefinitions中配置的typeName=jsonNode对应hbm中的type=jsonNode
    	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    		<property name="dataSource" ref="dataSource" />
    		<property name="hibernateProperties">
    			<props>
    				<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
    				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
    				<prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size}</prop>
    				<prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
    				<prop key="hibernate.connection.autocommit">${jdbc.autoCommit}</prop>
    				<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
    			</props>
    		</property>
    		<property name="typeDefinitions">
    			<list>
    				<bean class="org.springframework.orm.hibernate3.TypeDefinitionBean">
    					<property name="typeName" value="jsonNode"/>
    					<property name="typeClass" value="org.skzr.framework.dao.model.JsonNodeType"/>
    				</bean>
    			</list>
    		</property>
    		<property name="mappingLocations">
    			<list>
    				<value>${hibernate.mappingLocations}</value>
    			</list>
    		</property>
    	</bean>
     
  5. 经过测试一切OK
    @Test
    	public void testJsonType() {
    		List<Test> funs = baseDao.loadAll(Test.class);
    		Assert.assertFalse(funs.isEmpty());
    		for (Test fun : funs) {
    			((ObjectNode) fun.getJson1()).put("abc", 123);
    			((ObjectNode) fun.getJson2()).put("abc2", "123");
    		}
    		baseDao.saveOrUpdateAll(funs);
    	}
     

总结:目前基本没有遇到其他问题。

 

参考:

jackson json官网

jackson json引号问题:别人的问题

hibernate官网:5.2.3. Custom value types6.4. Custom types

 

 

1
3
分享到:
评论

相关推荐

    Hibernate.3.6.3帮助文档

    Hibernate.3.6.3.chm是根据hibernate-distribution-3.6.3.Final中的javadocs,使用chm文档生成工具 生成的chm格式的帮助文档

    Hibernate 3.6.3 入门程序

    【标题】"Hibernate 3.6.3 入门程序" 【内容详解】 Hibernate 是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在数据库中操作对象的简便方法。Hibernate 3.6.3是该框架的一个稳定版本,提供了许多...

    python 3.6.3中文手册

    以下将详细介绍Python 3.6.3版本中的重要知识点: 1. 字典类型改进:Python 3.6引入了有序字典(insertion-ordered dictionaries),这意味着字典中的元素将按照它们被插入的顺序来迭代。这一特性在后续版本中得到...

    Hibernate 3.6.3 API

    最新Hibernate 3.6.3 API

    hibernate-distribution-3.6.3.Final-dist.zip

    Hibernate3 框架,免费下载 Hibernate 是一个开放源代码的对象关系映射框架, 它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系, 是一个全自动的 orm 框架,hibernate 可以自动生成SQL语句,...

    Hibernate 3.6.7.Final.rar

    在这个“Hibernate 3.6.7.Final.rar”压缩包中,包含的是Hibernate 3.6版本的源代码,这个版本在当时是一个稳定且广泛使用的版本。 在Hibernate 3.6中,有几个重要的知识点值得深入探讨: 1. **对象关系映射(ORM...

    hibernate-c3p0-3.6.3.Final.jar

    hibernate-c3p0.jar 各个版本,免费下载 C3PO JDBC 连接池工具

    python官方3.6.3版本exe安装包

    3. **自定义安装选项**:在安装过程中,用户可以选择自定义安装路径、是否添加Python到系统环境变量、是否创建桌面快捷方式等。 4. **安装组件**:Python 3.6.3通常会包含Python解释器、标准库、pip(包管理器)等...

    maven3.6.3.zip

    在本文中,我们将深入探讨Maven 3.6.3版本的关键特性、工作原理以及如何利用它进行项目构建。 **一、Maven 3.6.3 版本特点** 1. **性能提升**:Maven 3.6.3对内部算法进行了优化,提高了依赖解析和构建速度,降低...

    python 3.6.3中文手册无水印版

    文档制作不易,请尊重劳动成果,python 3.6.3中文手册

    Python-3.6.3.tgz

    通过下载、编译和安装Python 3.6.3源码包,开发者可以深入了解Python的内部工作原理,并根据特定需求进行自定义配置,以满足特定环境或项目的需求。同时,这也是学习Python内核和C语言扩展的良好实践。

    python3.6.3版本

    - **类型注解(Type Annotations)**:3.6版本对类型注解的支持更加强大,有助于静态类型检查和代码理解。 2. **性能提升**: - **字典优化**:Python 3.6对字典进行了内部优化,使其在插入和查找操作上速度更快...

    SANGFOR_WAC_V3.6.3_portal页面自定义配置指导手册.pdf

    【PORTAL页面自定义配置】是SANGFOR WAC V3.6.3版本中的一项重要功能,允许管理员根据自身需求调整用户在接入无线网络时所看到的认证页面的外观和内容。以下是对该配置手册内容的详细解读: 1. **修改页面Logo**: ...

    apache-maven-3.6.3-bin

    apache-maven-3.6.3-bin。apache-maven-3.6.3-bin。apache-maven-3.6.3-bin。apache-maven-3.6.3-bin。apache-maven-3.6.3-bin。apache-maven-3.6.3-bin。apache-maven-3.6.3-bin。apache-maven-3.6.3-bin。apache-...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     11.1.2 Java时间和日期类型的Hibernate映射类型  11.1.3 Java大对象类型的Hibernate映射类型  11.1.4 JDK自带的个别Java类的Hibernate映射类型  11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  ...

    python-3.6.3-amd64.exe.zip

    - 在安装向导中,你可以选择自定义安装路径,推荐将Python添加到系统路径,以便在命令行中直接使用Python和pip。 - 检查是否勾选“Add Python to PATH”,这会自动将Python添加到系统的PATH环境变量中。 - 完成...

    代码统计linecount3.6.3

    在实际应用中,LineCount3.6.3可以帮助开发者追踪代码的增长情况,发现可能的冗余或过度注释问题。对于团队协作来说,它能定期提供项目进度的量化反馈,使团队成员对各自的工作量有清晰的认识。对于管理者,这些数据...

Global site tag (gtag.js) - Google Analytics