- 浏览: 1504644 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (798)
- struts2 (42)
- servlet (20)
- quartz (4)
- jquery & ajax (24)
- tomcat (5)
- javascript (15)
- struts1 (8)
- 搜索关键字及链接 (3)
- fckeditor (3)
- Apache (5)
- spring (22)
- linux (3)
- 企业应用 (8)
- 综合应用 (13)
- 服务器 (2)
- 数据库 (85)
- 性能调优 (21)
- 网络应用 (15)
- 缓存技术 (8)
- 设计模式 (39)
- 面试题 (7)
- 程序人生&前辈程序员 (29)
- java基础 (59)
- hibernate (75)
- log4j (4)
- http (11)
- 架构设计 (28)
- 网页设计 (12)
- java邮件 (4)
- 相关工具 (11)
- ognl (7)
- 工作笔记 (18)
- 知识面扩展 (12)
- oracle异常 (1)
- 正则表达式 (2)
- java异常 (5)
- 项目实践&管理 (1)
- 专业术语 (11)
- 网站参考 (1)
- 论坛话题 (2)
- web应用 (11)
- cxf&webservice (22)
- freemarker (3)
- 开源项目 (9)
- eos (1)
- ibatis (6)
- 自定义标签 (3)
- jsp (3)
- 内部非公开文档(注意:保存为草稿) (0)
- 国内外知名企业 (2)
- 网店 (3)
- 分页 (1)
- 消费者习惯 (2)
- 每日关注 (1)
- 商业信息 (18)
- 关注商业网站 (1)
- 生活常识 (3)
- 新闻 (2)
- xml&JSON (5)
- solaris (1)
- apache.common (3)
- BLOB/CLOB (1)
- lucene (2)
- JMS (14)
- 社会进程 (8)
- SSH扩展 (2)
- 消费心理 (1)
- 珠三角 (1)
- 设计文档 (1)
- XWork&webwork (1)
- 软件工程 (3)
- 数据库及链接 (1)
- RMI (2)
- 国内外知名企业&人物 (1)
最新评论
-
司c马:
简介易懂、
OutputStream和InputStream的区别 -
在世界的中心呼喚愛:
解决我的问题
Java获取客户端的真实IP地址 -
bo_hai:
都是些基本的概念呀!
SSO -
tian_4238:
哥们,你也是搞水利这块的吧。
巧用SQLQuery中的addScalar -
loveEVERYday:
java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp小结
学习hibernate有段时间了,最近复习这门技术时看到了自定义用户类的使用。个人认为这个知识点比较重要,现总结下,供以后自己回顾时看。
hibernate支持的类型已经基本上能满足用户的各方面需求,但有些存放进数据库的数据并不能直接拿来放页面显示,必须经过一定格式的转换,最典型的例子就是多个email的存储问题。用户在页面可以同时输入多个email信息,如果在数据库中定义多个varchar类型的email字段显然是不必要的。数据库中只需要定义一个email字段即可。这其中多个email存到一个email字段的过程大可写个公共方法进行email字符串的组装和拆分,但每次使用该字段时都要调用该公共方法就显得麻烦了。这个时候使用hibernate的UserType类就可以很好的完成这样的任务。
org.hibernate.usertype.UserType是一个接口,源码如下:
public interface UserType {
public abstract int[] sqlTypes();
public abstract java.lang.class returnedClass();
public abstract boolean equals(java.lang.Object obj, java.lang.Object obj1)
throws org.hibernate.HibernateException;
public abstract int hashCode(java.lang.Object obj)
throws org.hibernate.HibernateException;
public abstract java.lang.Object nullSafeGet(java.sql.ResultSet resultset, java.lang.String as[], java.lang.Object obj)
throws org.hibernate.HibernateException, java.sql.SQLException;
public abstract void nullSafeSet(java.sql.PreparedStatement preparedstatement, java.lang.Object obj, int i)
throws org.hibernate.HibernateException, java.sql.SQLException;
public abstract java.lang.Object deepCopy(java.lang.Object obj)
throws org.hibernate.HibernateException;
public abstract boolean isMutable();
public abstract java.io.Serializable disassemble(java.lang.Object obj)
throws org.hibernate.HibernateException;
public abstract java.lang.Object assemble(java.io.Serializable serializable, java.lang.Object obj)
throws org.hibernate.HibernateException;
public abstract java.lang.Object replace(java.lang.Object obj, java.lang.Object obj1, java.lang.Object obj2)
throws org.hibernate.HibernateException;
}
实现的EmailType类代码如下:
public class EmailType implements UserType {
private static final int[] TYPES = new int[]{Types.VARCHAR};
//该方法声明的类型与数据库相应字段定义的类型一致。在这里,数据库中定义的email字段类型为varchar类型
public int[] sqlTypes() {
return TYPES;
}
//设置成nullSafeGet方法的返回值
public Class returnedClass() {
return List.class;
}
//用于数据对比,如果hibernate数据改变返回false。当为false时,会将变化入库。
public boolean equals(Object obj1, Object obj2) throws HibernateException {
if(obj1 == obj2) {
return true;
}
if(obj1 != null && obj2 != null) {
List list1 = (List) obj1;
List list2 = (List) obj2;
if(list1.size() != list2.size()) {
return false;
}
for (int i = 0; i < list1.size(); i++) {
String str1 = (String) list1.get(i);
String str2 = (String) list2.get(i);
if(!str1.equals(str2)) {
return false;
}
}
return true;
}
return true;
}
public int hashCode(Object arg0) throws HibernateException {
return 0;
}
//将数据库的字符串拆分成数组传给PO
public Object nullSafeGet(ResultSet rs, String[] names, Object arg2) throws HibernateException, SQLException {
String emails = (String) Hibernate.STRING.nullSafeGet(rs, names);
List list = parse(emails);
if(list != null) {
return list;
} else {
return null;
}
}
//将email数据合成字符串存入数据库。当deepCopy方法返回false时将调用该方法。
public void nullSafeSet(PreparedStatement pstat, Object obj, int index) throws HibernateException, SQLException {
if(obj != null) {
String emailStr = assemble((List)obj);
Hibernate.STRING.nullSafeSet(pstat, emailStr, index);
} else {
Hibernate.STRING.nullSafeSet(pstat, obj, index);
}
}
//复制该对象,原对象由hibernate管理,副本对象用于判断对象是否发生变化时用
public Object deepCopy(Object value) throws HibernateException {
System.out.println("deepCopy");
List sourcelist = (List)value;
List targetlist = new ArrayList();
targetlist.addAll(sourcelist);
return targetlist;
}
//将email数据组装成字符串,私有方法,供nullSafeSet方法使用
private String assemble(List emailList) throws HibernateException {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < emailList.size()-1; i++) {
buffer.append(emailList.get(i)).append(",");
}
buffer.append(emailList.get(emailList.size()-1));
return buffer.toString();
}
//将email字符串拆分成数组,私有方法,供nullSafeGet方法使用
private List parse(String emailStr) throws HibernateException {
String[] emails = emailStr.split(",");
List emailList = new ArrayList();
for (int i = 0; i < emails.length; i++) {
emailList.add(emails[i]);
}
return emailList;
}
public boolean isMutable() {
return false;
}
public Serializable disassemble(Object arg0) throws HibernateException {
return null;
}
public Object assemble(Serializable arg0, Object arg1) throws HibernateException {
return null;
}
public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException {
return null;
}
}
当程序执行select操作时,系统会先调用nullSafeGet方法,将值传入PO中,接着调用deepCopy生成对象副本供之后比较对象用。
当程序执行insert操作时,系统会先进行deepCopy,然后再调用nullSafeSet方法。
光实现UserType类还不行,必须在email所在的映射文件中进行配置,代码如下:
<hibernate-mapping>
<class name="po" table="sql表">
<property name="email" column="email" type="EmailType"/>
</class>
</hibernate-mapping>
其中email属性的type就是用户自定义类型。
发表评论
-
技巧:利于ThreadLocal模式管理Session
2011-08-02 10:31 1268在利用Hibernate开发DAO模块时,我们和Session ... -
Hibernate中的回调与拦截机制
2011-07-27 17:31 1461在某些情况下,我们需要对实体的CURD操作进行捕获并执行一些操 ... -
HibernateTemplate中HibernateCallback的事务
2011-07-04 14:41 1449目的:使用HibernateTemplate执行execute ... -
Hibernate的复杂用法HibernateCallback
2011-07-04 14:40 1340HibernateTemplate还提供一种更加灵活的方式来操 ... -
Hibernate session FlushMode有五种属性
2011-07-04 13:59 17311、NEVER:已经废弃了,被MANUAL取代了2 MANUA ... -
数据库持久层——浅谈hibernate中的Session
2011-07-01 22:49 1670大多数情况下,Session 管理的目标聚焦于通过合理的设 ... -
详解Hibernate Session
2011-07-01 22:42 1497这里介绍Hibernate Session,Ses ... -
HttpSession与Hibernate中Session的区别
2011-07-01 22:41 1295一、javax.servlet.http.HttpSess ... -
巧用SQLQuery中的addScalar
2011-06-02 17:16 5747当我们用HQL进行子查询的时候,如select * from ... -
hibernate中SQLQuery的addEntity();方法
2011-04-13 14:48 2894如果使用原生sql语句进行query查询时,hibernate ... -
Hibernate的clear(),flush(),evict()方法详解
2011-03-24 11:18 17741.Clear 方法 无论是Load 还是 G ... -
hibernate模糊查询-Restrictions.ilike & Expression.like
2011-03-11 10:32 16360Criteria criteria = session.c ... -
Hibernate分页查询小结
2011-03-10 11:14 1831通常使用的Hibernate通常是三种:hql查询,QBC查询 ... -
current_session_context_class
2011-03-07 15:31 1295此设置的作用如下: What does sessionFac ... -
Hibernate的拦截器和监听器
2010-12-14 15:06 1387核心提示:最近项目需要,用到了Hibernate的拦截器和 ... -
孙卫琴.精通Hibernate:Java对象持久化技术详解_触发器使缓存与数据库不一致
2010-12-14 08:46 1393p198 -
孙卫琴.精通Hibernate:Java对象持久化技术详解_优化报表查询的性能
2010-12-13 17:51 1273p332 -
孙卫琴.精通Hibernate:Java对象持久化技术详解_查询结果类型
2010-12-13 17:34 1307p329 -
孙卫琴.精通Hibernate:Java对象持久化技术详解_投影查询
2010-12-13 17:31 1425p325 -
深入浅出hibernate_夏昕_hibernate别名完成ResultSet和实体的映射
2010-12-13 17:09 1355p199
相关推荐
有三种类型的QListWidgetItem:Type, UserType和NoType,其中Type和UserType分别对应内置类型和用户自定义类型。 2. **自定义显示内容**:默认情况下,QListWidget仅显示文本。但通过创建QListWidgetItem并设置其...
2. **实现Hibernate用户类型接口**:自定义类型需要实现`org.hibernate.usertype.UserType`接口。这个接口要求我们重写一些关键方法,如`nullSafeGet()`、`nullSafeSet()`、`equals()`、`hashCode()`等,以便...
本资源“商业编程-源码-VC开发工具使用技巧源代码 usertype.zip”包含了一组与VC开发相关的源代码,旨在帮助开发者深入理解和掌握VC开发工具的实用技巧。 1. **VC开发环境设置**:VC不仅仅是一个编译器,它还包括一...
在PyQt框架中,开发图形用户界面(GUI)应用程序时,经常会用到QTreeWidget和QListWidgetItem这两种Model/View的便利类。它们分别用于创建树形视图和列表视图,而在这两个类中,我们可以指定一个名为`type`的参数来...
3. **自定义UserType实例**:例如,如果我们需要在`TUSER`表中存储用户的电子邮件,但不想为每个邮箱创建单独的记录,可以使用`UserType`将多个邮箱地址存储在一个`VARCHAR`字段内,以分号分隔。自定义的`Email`类...
除了自定义用户类型,还可以利用Hibernate的`@GenericGenerator`和`@GeneratedValue`注解配合`Hibernate.generateValue`方法,生成JSON字段的值。此外,你还可以通过自定义函数或存储过程来处理更复杂的JSON操作。 ...
1. **创建用户类型文件**:在VS2005的安装目录下(通常是`C:\Program Files\Microsoft Visual Studio 8\Common7\IDE`),新建一个名为`usertype.dat`的文本文件。 2. **添加关键字**:打开该文件,在其中逐行添加...
9. Userdef1、Userdef2、Userdef3:自定义字段 1、2、3,varchar(100),用于保存用户的自定义信息。 注意 泛微 Webservice 接口文档说明中带有“原有”字眼的字段为客户表中已经存在的字段,其他字段需在客户...
- **使用org.hibernate.usertype.UserType**: 实现自定义用户类型。 - **使用org.hibernate.usertype.CompositeUserType**: 映射复合类型。 - **类型注册**: 注册自定义类型。 #### 7. 集合映射 - **持久化集合*...
其中,ID字段是管理员的唯一标识,usertype字段是用户类型,userid字段是用户登录ID。 7. dede_admintype 表:系统用户组管理表 该表用于存储系统用户组的信息,包括组级别编号、组名称、系统默认组、权限列表等...
##### 4.1 用户实体类(UserProfile) ```java package com; import java.util.Collection; public class UserProfile { private String userId; private String userType; private String companyNo; private ...
通过设置`QListWidgetItem::type`为`QListWidgetItem::UserType`,你可以添加自定义的小部件: ```cpp QListWidgetItem *item = new QListWidgetItem(listWidget); item->setType(QListWidgetItem::UserType); ...
#### 考虑使用用户自定义类型 当需要持久化某些来自第三方库的Java类型时,如果这些类型没有提供适当的getter和setter方法,可以考虑实现`org.hibernate.UserType`接口来定义自定义类型。这样可以在不修改原有类的...
首先,USERTYPE.DAT是一个可能包含用户类型数据的文件,通常在MFC中用于存储用户自定义的类型信息或者应用程序特定的数据。开发者可以通过这个文件学习如何在MFC中处理二进制数据文件,以及如何使用MFC的文件操作类...
`USERTYPE.DAT`:这个文件可能是一个用户类型数据库,通常用于存储应用程序中的自定义数据类型或用户定义的类别信息。在MFC中,这样的文件可能会被用到数据持久化或用户设置的存储中,特别是在处理与数据库交互的...
2. **USERTYPE.DAT**:这个文件可能是书中某个例子或实验中使用的数据文件,通常用来存储用户定义的数据类型或者程序运行所需的配置信息。在MFC程序中,数据文件的读写可以通过CFile类或者更高级别的如CDocument来...
USERTYPE.DAT 文件可能是一个用于存储用户类型或配置信息的数据文件,通常在MFC应用程序中,这样的文件可能被用来持久化用户设置或者特定应用的自定义数据。 MFCFAQ40.HTM 可能是MFC常见问题解答的一部分,HTML格式...
对于JSON数组,你可以使用 `JSONArray` 类,对于嵌套的对象,仍然是 `JSONObject`。例如,假设你有一个用户列表: ```java List<User> users = new ArrayList(); for (JSONObject jsonObject : jsonArray) { ...
为了实现这些高亮功能,"usertype"文件可能是一个自定义的语法高亮配置文件,用于VC的集成开发环境中。它可以包含正则表达式或其他规则,用于匹配和标记宏、结构体以及大写标识符。用户可以自定义这些规则以满足特定...