http://developer.51cto.com/art/200909/154162.htm
介绍Hibernate使用UserType
这里介绍Hibernate使用UserType,UserType就是用户自定义类型,这里的类型指的是除了Hibernate定义的那些类型之外的用户自己定义的。
AD:
Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate使用UserType,包括介绍UserType就是用户自定义类型等方面。
1、建立数据库的时候最好建立一个跟业务逻辑完全没有关系的id,这样的好处就是以后当数据量大的时候可以容易的建立索引,而且当业务逻辑变化的时候底层的数据结构不用变化很大。
2、代码的干净是非常非常的重要的,从现在开始尽量让自己的代码写的漂亮把!因为干净的代码不仅容易维护,而且容易发现bug,在Hibernate使用UserType是很好用的。举个经典的例子:
实现Hibernate使用UserType接口的email 类
比如 你需要在 TUSER 表中记录一个人的 email ,单独为其建立一张数据库表是很浪费资源的,一般的方法是将TUSER 一栏 varchar 的来记录email ,多个 email 之间用 " ; "号分开,我曾经做的项目中采取的方法是:取出一个记录着多条 email 的 string然后再来用 ; 号拆开,但是这样子就有个不好,在一堆整齐的 get 方法用出来一个有 bad smell 的代码。
有两个方法,一个是修改映射TUSER的 java 类在其中增加一个 getEmail 方法,返回一个 list ,该方法对原先的 getEmail 方法进行二次处理。第二个方法就是采用UserType 。
UserType就是用户自定义类型,这里的类型指的是除了Hibernate定义的那些类型之外的用户自己定义的。
一个实现Hibernate使用UserType接口的 email 类如下(里面的每个方法都是必须实现的接口方法,许多都可以复制粘贴的,不复杂):
- public class Email implements UserType
- ...{
-
- // 表示本类型实例是否可变,一般是不可变
- public boolean isMutable()
- ...{
- return false;
- }
-
- //该类型对应的 sql 类型
- public int[] sqlTypes()
- ...{
- return new int[]......{Types.VARCHAR};
- }
-
- // 改类型对应的 java 类型
- public Class returnedClass()
- ...{
- return List.class;
- }
-
- // 完全复制的方法,由于是用户自己定义的类型
- //所以hibernate并不知道要如何来复制这个类,需要用户自己定义
- public Object deepCopy(Object value)throws HibernateException
- ...{
-
List source = (List)value;
-
List target = new ArrayList();
- target.addAll(source);
- return target;
- }
-
- //equals方法,这个就不用多说了吧,肯定是要用户自定义的
- public boolean equals(Object x,Object y) throws HibernateException
- ...{
- //这部分不写出来了,自己实现吧,这个不是我要讲的重点
- }
-
- /** *//**//*
- 这才是重头戏!nullSafeGet 和nullSafeSet 是核心所在,对数据的后期处理都在这两个方法里面
- nullSafeGet 是读取的方法
- owner 目前没用到过。
- names 是对应的数据库列名,UserType是可以对应多个列的
- */
- public Object nullSafeGet(ResultSet rs,String[] names,Object owner)
throws HibernateException,SQLException
- ...{
-
String value = (String)Hibernate.STRING.nullSafeGet(rs,names[0]);
- if(value != null)
- ...{
- //把 string 拆开成 list 的代码放在这里
- }
- return resultList;//得到了拆开的 邮件列表
- }
-
- /**//*
- 保存的方法
- index 是那个 PreparedStatement 的参数序号,一般来说不用管直接往下传
- value 就是要保存的数据,在这边是一个保存着 email 列表的 List
- */
- public void nullSafeSet(PreparedStatement st,Object value,int index)
throws HibernateException,SQLException
- ...{
- if(value != null)
- ...{
-
String email = assemble(value);//将 List 拼合成 String 的 Email 的方法
- Hibernate.STRING.nullSafeSet(st,email,index);
- }
- else
- ...{
- Hibernate.STRING.nullSafeSet(st,value,index);
- }
- }
- }
在TUser.hbm.xml 中如此设置:
- <hibernate-mapping>
-
<class name="entity.TUser" table="T_USER">
-
</class>
- ..............
-
<property name = "emali"column = "email"type = "mytype.Email"/>
-
</hibernate-mapping>
在TUser.java中如此设置
- public class TUser implement Serializable
- ...{
- private Integer id;
- privarte Stirng name;
- //看,这边的 email 可以大胆的使用 List 了
- private List email;
-
- //下面是一些 getter 和 setter 了
- }
这样设置后你使用 TUser的时候要取出 email 直接 getEmail 出来的就是一个List 了,而且前台根本不知道后台干了什么,这样代码就简洁多了。
分享到:
相关推荐
1.1. Part 1 - The first Hibernate Application ................................................................ 1 1.1.1. Setup .............................................................................
1. 创建或编辑usertype.dat文件(此文件在VS安装目录下的Common7\IDE下面,比如我的就在D:\Program Files\Microsoft Visual Studio 8\Common7\IDE\usertype.dat),添加如下的关键字列表,每个单词占一行,如果你想...
Usertype: Administrator Username: admin Password: admin Interface URL: http://www.yoursite.nul/xcart-directory/admin/ b. Provider account: Usertype: provider Username: provider Password: ...
11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 ...
VC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zip
fileContent字段映射为Spring所提供的BlobByteArrayType类型,BlobByteArrayType是用户自定义的数据类型,它实现了Hibernate 的org.hibernate.usertype.UserType接口。BlobByteArrayType使用从sessionFactory获取...
商业编程-源码-VC开发工具使用技巧源代码 usertype.zip
11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 ...
HLSL的关键字,放在vs的IDE文件下,以在vs中高亮HLSL的关键字
11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 ...
11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 ...
在VS中配置CUDA时,本身是不识别CUDA关键字的,关键字不能高亮。早期的CUDA版本在SDK中提供了usertype.dat,其中包含CUDA的关键字,但后来的CUDA没有这个文件,网上找了好久,现在贴出来亲测可用~
----任务分配---- 雷吉 tblactivity,tbljoboffer,tbljob,tblcompanyadmin,tblusertype ADD / EDIT / FETCH 丹尼尔 登录,获取成功。 俊 tblcompanyuser,tblpost,...private $userType; constant $userFormVal
2.2.2 使用Hibernate EntityManager 2.2.3 引入EJB组件 2.2.4 切换到Hibernate接口 2.3 反向工程遗留数据库 2.3.1 创建数据库配置 2.3.2 定制反向工程 2.3.3 生成Java源代码 2.4 与...
未来电话及其测试 在这个项目中,我制作了实现CRUD的... -UserType.scala repository dao -Dao.scala Service -UserService.scala test scala org
需要使用这个:添加到 build.gradle compile 'org.jadira.usertype:usertype.jodatime:2.0.1' add to *.hbm.xml 数据库详细信息:CREATE DATABASE datamanagerdb WITH OWNER = datamanageruser ENCODING = 'UTF8' ...
使用C++ fstream,ofstream,ifstream封装日志操作类,可设置日志文件存储大小,超出限制新建日志;日志事件毫秒级打印。
该项目是使用版本10.0.5生成的。 当前的启动用户进行测试 用户名 密码 用户类型 账户余额 abc123! UserType.basic 1000000 abc123! UserType.basic 2000 abc123! UserType.admin 1000000000 abc123! ...
- UserType - PasswordResetter - Profile(Foreign)[nulluble] - Company(Foreign)[nullable] - Role(Foreign) 订阅内容 - Id - Name - Email - Status 工作 - Id - Organisation - Location - Grade - ...