- 浏览: 214973 次
文章分类
- 全部博客 (227)
- framework (13)
- opensource (3)
- database (20)
- linux (16)
- javase (19)
- management (1)
- spring (26)
- test (3)
- sqlserver (3)
- EJB (1)
- esb (24)
- others (3)
- eclipse (13)
- algorithm (1)
- server (1)
- hibernate (24)
- maven (18)
- servlet (1)
- activemq (5)
- liferay (2)
- camel (1)
- exception (11)
- tomcat (5)
- cxf (10)
- log (1)
- openJPA (1)
- jpa (1)
- c3p0 (6)
- cas (1)
- osgi (6)
- svn (2)
- awake (0)
- design (7)
- webservice (6)
- JavaEE (6)
- eclipse,web (1)
- web (7)
- blog (1)
- rest (6)
- http (2)
- powerdesigner (1)
- servicemix (5)
- cache (1)
- jquery (2)
- security (1)
- js (3)
- json (2)
- report (2)
- birt (1)
- jsp (1)
- activiti (1)
- mac (1)
- dubbo (3)
- shiro (2)
- mq (1)
- nginx (1)
- springcloud (1)
最新评论
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 了,而且前台根本不知道后台干了什么,这样代码就简洁多了。
转自:http://developer.51cto.com/art/200909/154162.htm
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 了,而且前台根本不知道后台干了什么,这样代码就简洁多了。
转自:http://developer.51cto.com/art/200909/154162.htm
发表评论
-
springcloud分布式服务脏读死锁解决方案
2017-08-23 11:33 894解决springcloud分布式服务脏读死锁等异常 查询更 ... -
springSecurity源码分析——DelegatingFilterProxy类的作用
2016-01-18 16:02 602转自:http://www.cnblogs.com/hzhu ... -
软负载与nginx那些强大的不可不说的功能
2015-12-04 10:42 1290转自:http://www.uml.org.cn ... -
Apache Shiro
2015-09-23 16:36 720让Apache Shiro保护你的应用 http://w ... -
搭建dubbo测试环境
2015-09-17 16:41 1564转自:http://www.jianshu.com/p/9b ... -
dubbo 安装手册(修订)
2015-09-17 16:24 866以下内容摘抄自官网https://github.com/al ... -
Spring 之注解事务 @Transactional
2015-09-16 14:40 1987spring 事务注解 默认遇到throw new Run ... -
Axis,axis2,Xfire以及cxf对比
2015-01-29 17:26 424Axis,axis2,Xfire以及cxf对比 转自: ... -
基于@Aspectj使用Spring aop @Around进行权限拦截
2015-01-07 10:36 1765转自:http://zhanghua.1199.blog.1 ... -
OAuth 2.0系列教程
2014-12-25 16:04 610http://ifeve.com/oauth2-tutoria ... -
关于高并发,大数据框架的建议
2014-10-27 16:35 593摘自CSDN网友的建议 1.数据量比较大的话,建议使用Ha ... -
Hibernate通过函数执行sql
2014-04-23 18:06 650java调用代码 public BcsResponse g ...
相关推荐
在Hibernate中,使用`UserType`可以提升代码质量。`UserType`允许我们自定义数据类型的映射,以便更好地适应特定业务需求。 3. **自定义UserType实例**:例如,如果我们需要在`TUSER`表中存储用户的电子邮件,但不...
- **使用org.hibernate.usertype.UserType**: 实现自定义用户类型。 - **使用org.hibernate.usertype.CompositeUserType**: 映射复合类型。 - **类型注册**: 注册自定义类型。 #### 7. 集合映射 - **持久化集合*...
- `TYPE`:自定义类型映射,需要实现`org.hibernate.usertype.UserType`接口,可以自定义存储和读取的逻辑。 2. **配置枚举类型映射**: 在Hibernate的映射文件(.hbm.xml)中,可以使用`<typedef>`元素定义枚举...
在使用Hibernate时,确保正确配置并包含必要的JAR(Java Archive)文件至关重要,因为这些库提供了框架运行所需的功能。下面我们将详细探讨Hibernate所需的JAR包及其作用。 1. **hibernate-core.jar**:这是...
1. org.hibernate.usertype.UserType:可以自定义数据映射类型。 2. org.hibernate.dialect.Dialect abstract_class:Hibernate 对于每种数据库都定义了独有的方言,比如 Oracle、MSSQL、Sybase 等数据库系统都有...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句。本文将深入探讨如何在Hibernate配置中设置与数据库字段的对应关系,以及...
本文将深入探讨如何使用Hibernate实现领域对象的自定义字段,这涉及到对Hibernate核心概念的理解以及自定义类型的应用。 首先,我们需要了解Hibernate的核心概念。Hibernate主要通过配置文件(hibernate.cfg.xml)...
在 Hibernate 框架中,使用自定义类型映射 Oracle 中的 LONG 类型字段是一种常见的解决方案。通过实现 UserType 接口,我们可以定制 LONG 类型字段的读写操作。在本例中,我们定义了一个名为 CustomLong 的类,该类...
- 如果使用的是HBM(Hibernate Mapping)文件,需要在对应字段上配置`type`属性,指向自定义的`UserType`全限定类名。 通过以上步骤,你可以确保Hibernate在处理MySQL的`TEXT`字段时能够正确地进行序列化、反序列...
Hibernate 是一个强大的 Java 持久化框架,它简化了数据库与对象之间的交互。通过提供一组丰富的API,Hibernate使得开发者能够在应用中轻松地管理和操作数据库数据。...理解并熟练使用这些接口是掌握Hibernate的关键。
这通常通过实现`org.hibernate.usertype.UserType`接口来完成,该接口定义了将Java类型转换为数据库类型的逻辑。 以下是一些关键步骤: 1. **创建动态扩展的基类**:定义一个基类,它继承自Hibernate的`...
当需要持久化某些来自第三方库的Java类型时,如果这些类型没有提供适当的getter和setter方法,可以考虑实现`org.hibernate.UserType`接口来定义自定义类型。这样可以在不修改原有类的情况下完成持久化任务。 #### ...
使用自定义类型时,你需要在实体类的属性上使用`@Type`注解,指定自定义类型的实现类,使得Hibernate在操作这些属性时能够调用我们定义的转换逻辑。 例如,如果你有一个自定义日期时间类型,可以这样使用: ```java...
11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 ...
**hibernate 帮助文档**是学习和使用Hibernate框架的关键资源,其中包含了详尽的API参考、示例代码和教程。通过这份文档,开发者可以了解到如何配置Hibernate,如何创建和管理实体类,以及如何执行CRUD(创建、读取...
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 与...
- **自定义数据类型**:通过实现 `org.hibernate.usertype.UserType` 接口来自定义数据类型。 通过以上内容的学习,可以全面理解 Hibernate 的基本原理和使用方法,掌握其核心概念和技术要点,从而能够有效地利用 ...
为了更精确地控制 `char` 类型的处理方式,可以考虑使用 Hibernate 提供的自定义类型,比如 `CharacterType` 或者自定义实现 `org.hibernate.usertype.UserType` 接口来创建自定义的类型转换器。 ##### 3. 参数绑定...
10. **类型转换**:Hibernate提供UserType接口,允许自定义Java类型与数据库类型的转换,处理非标准或复杂类型的持久化。 11. **事件监听器**:通过实现特定接口,如PreInsertEventListener,可以监听并干预对象...