import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import net.sf.hibernate.HibernateException;
/**
* @author hy-he
*
*/
public interface UserType {
/**
* 返回UserType所映射字段的SQL类型(java.sql.Types)
* 返回类型为int[],其中包含了映射个字段的SQL类型代码
* (UserType可以映射到一个或者多个字段)
* @return
*/
public int[]sqlTypes();
/**
* UserType.nullSafeGet()所返回的自定义数据类型
* @return
*/
public Class returnedClass();
/**
* 自定义数据类型的比对方法
* 此方法将用作脏数据检查,参数x、y分别为数据的两个副本
* 如果equals方法返回false,则Hibernate将认为数据发生变化,并将变化更新到数据库表中
* @param x
* @param y
* @return
* @throws HibernateException
*/
public boolean equals(Object x,Object y)throws HibernateException;
/**
* 从JDBC ResultSet读取数据,将其转换为自定义类型后返回
* (此方法要求对克能出现null值进行处理)
* names中包含了当前自定义类型的映射字段名称
* @param rs
* @param names
* @param owner
* @return
* @throws HibernateException
* @throws SQLException
*/
public Object nullSafeGet(ResultSet rs,String[] names,Object owner)throws HibernateException,SQLException;
/**
* 本方法将在Hibernate进行数据保存时被调用
* 我们可以通过PreparedStateme将自定义数据写入到对应的数据库表字段
* @param st
* @param value
* @param index
* @throws HibernateException
* @throws SQLException
*/
public void nullSafeSet(PreparedStatement st,Object value,int index)throws HibernateException,SQLException;
/**
* 提供自定义类型的完全复制方法
* 本方法将用构造返回对象
* 当nullSafeGet方法调用之后,我们获得了自定义数据对象,在向用户返回自定义数据之前,
* deepCopy方法将被调用,它将根据自定义数据对象构造一个完全拷贝,并将此拷贝返回给用户
* 此时我们就得到了自定义数据对象的两个版本,第一个是从数据库读出的原始版本,其二是我们通过
* deepCopy方法构造的复制版本,原始的版本将有Hibernate维护,复制版由用户使用。原始版本用作
* 稍后的脏数据检查依据;Hibernate将在脏数据检查过程中将两个版本的数据进行对比(通过调用
* equals方法),如果数据发生了变化(equals方法返回false),则执行对应的持久化操作
*
* @param value
* @return
* @throws HibernateException
*/
public Object deppCopy(Object value)throws HibernateException;
/**
* 本类型实例是否可变
* @return
*/
public boolean isMutable();
}
1.实现UserType接口的EMailList自定义类型
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import net.sf.hibernate.Hibernate;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.UserType;
import net.sf.hibernate.hql.Parser;
/**
* @author hy-he
*
*/
public class EMailList implements UserType {
private List emails;
private static final String SPLITTER = ";";
private static final int[] TYPES = new int[]{
Types.VARCHAR
};
/* (non-Javadoc)
* @see net.sf.hibernate.UserType#sqlTypes()
*/
public int[] sqlTypes() {
// TODO Auto-generated method stub
return TYPES;
}
/* (non-Javadoc)
* @see net.sf.hibernate.UserType#returnedClass()
*/
public Class returnedClass() {
// TODO Auto-generated method stub
return List.class;
}
/* (non-Javadoc)
* @see net.sf.hibernate.UserType#equals(java.lang.Object, java.lang.Object)
*/
public boolean equals(Object x, Object y) throws HibernateException {
if(x == y) return true;
if(x != null && y != null){
List xList = (List)x;
List yList = (List)y;
if(xList.size() != yList.size()) return false;
for(int i = 0;i<xList.size();i++){
String str1 = (String)xList.get(i);
String str2 = (String)yList.get(i);
if(!str1.equals(str2)) return false;
}
return true;
}
return false;
}
/* (non-Javadoc)
* @see net.sf.hibernate.UserType#nullSafeGet(java.sql.ResultSet, java.lang.String[], java.lang.Object)
*/
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
String value = (String)Hibernate.STRING.nullSafeGet(rs,names[0]);
if( value != null){
return parse(value);
}else{
return null;
}
}
/* (non-Javadoc)
* @see net.sf.hibernate.UserType#nullSafeSet(java.sql.PreparedStatement, java.lang.Object, int)
*/
public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
System.out.println("Set method excecuted");
if(value != null){
String str = assemble((List)value);
Hibernate.STRING.nullSafeSet(st,str,index);
}else{
Hibernate.STRING.nullSafeSet(st,value,index);
}
}
/* (non-Javadoc)
* @see net.sf.hibernate.UserType#deepCopy(java.lang.Object)
*/
public Object deepCopy(Object value) throws HibernateException {
List sourcelist = (List)value;
List targetlist = new ArrayList();
targetlist.addAll(sourcelist);
return targetlist;
}
/* (non-Javadoc)
* @see net.sf.hibernate.UserType#isMutable()
*/
public boolean isMutable() {
// TODO Auto-generated method stub
return false;
}
private String assemble(List emailList){
StringBuffer strBuf = new StringBuffer();
for(int i = 0;i<emailList.size()-1;i++){
strBuf.append(emailList.get(i)).append(SPLITTER);
}
strBuf.append(emailList.get(emailList.size()-1));
return strBuf.toString();
}
private List parse(String value){
String[] strs = StringUtils.split(value,SPLITTER);
List emailList = new ArrayList();
for(int i = 0;i<strs.length;i++){
emailList.add(strs[i]);
}
return emailList;
}
}
2.POJO:
import java.io.Serializable;
import java.util.List;
/**
* @author hy-he
* @hibernate.class
* table = "USER_TYPE_USER"
*/
public class UserTypeUser implements Serializable {
private Long id;
private String name;
private Integer age;
private List email = new ArrayList();
/**
* @hibernate.id
* column = "USER_ID"
* generator-class = "increment"
* @return
*/
public Long getId() {
return id;
}
/**
* @hibernate.property
* column = "AGE"
* @return
*/
public Integer getAge() {
return age;
}
/**
* @hibernate.property
* column = "EMAIL"
* type = "hibernate.usertype.EMailList"
* @return
*/
public List getEmail() {
return email;
}
/**
* @hibernate.property
* column = "NAME"
* @return
*/
public String getName() {
return name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setEmail(List email) {
this.email = email;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
3.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class
name="hibernate.usertype.UserTypeUser"
table="USER_TYPE_USER"
dynamic-update="false"
dynamic-insert="false"
>
<id
name="id"
column="USER_ID"
type="java.lang.Long"
>
<generator class="increment">
</generator>
</id>
<property
name="age"
type="java.lang.Integer"
update="true"
insert="true"
access="property"
column="AGE"
/>
<property
name="email"
type="hibernate.usertype.EMailList"
update="true"
insert="true"
access="property"
column="EMAIL"
/>
<property
name="name"
type="java.lang.String"
update="true"
insert="true"
access="property"
column="NAME"
/>
<!--
To add non XDoclet property mappings, create a file named
hibernate-properties-UserTypeUser.xml
containing the additional properties and place it in your merge dir.
-->
</class>
</hibernate-mapping>
4.运用:
insert方法:
public static void insertUser() throws HibernateException {
UserTypeUser user = new UserTypeUser();
user.setAge(new Integer(23));
user.setName("Test UserType");
user.getEmail().add("rever@hotmail.com");
user.getEmail().add("rever1@hotmail.com");
user.getEmail().add("rever2@hotmail.com");
user.getEmail().add("rever3@hotmail.com");
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
session.save(user);
tx.commit();
HibernateUtil.closeSession();
}
display方法:
public static void display() throws HibernateException {
Session session = HibernateUtil.currentSession();
List users = session.find("from UserTypeUser");
HibernateUtil.closeSession();
for (ListIterator iterator = users.listIterator(); iterator.hasNext();) {
UserTypeUser pu = (UserTypeUser) iterator.next();
System.out.println(pu.getName());
List emails = pu.getEmail();
for(int i = 0;i<emails.size();i++){
System.out.println(emails.get(i));
}
}
}
相关推荐
VC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zip
在VS中配置CUDA时,本身是不识别CUDA关键字的,关键字不能高亮。早期的CUDA版本在SDK中提供了usertype.dat,其中包含CUDA的关键字,但后来的CUDA没有这个文件,网上找了好久,现在贴出来亲测可用~
HLSL的关键字,放在vs的IDE文件下,以在vs中高亮HLSL的关键字
商业编程-源码-VC开发工具使用技巧源代码 usertype.zip
1. 创建或编辑usertype.dat文件(此文件在VS安装目录下的Common7\IDE下面,比如我的就在D:\Program Files\Microsoft Visual Studio 8\Common7\IDE\usertype.dat),添加如下的关键字列表,每个单词占一行,如果你想...
注意sql server类和access数据库可以使用vs自带的数据库启动,不需要安装庞大的sql安装包。 测试用户 qqq 123456 后台管理用户 admin 123456 模块介绍 管理员 上传电影模块 电影信息管理模块 用户信息管理模块 ...
注意sql server类和access数据库可以使用vs自带的数据库启动,不需要安装庞大的sql安装包。 测试用户 qqq 123456 后台管理用户 admin 123456 模块介绍 管理员 上传电影模块 电影信息管理模块 用户信息管理模块 ...
9.4.2 使用脱管的实体实例 9.5 在EJB组件中使用Java Persistence 9.5.1 注入EntityManager 9.5.2 查找EntityManager 9.5.3 访问EntityManagerFactory 9.6 小结 第10章 事务和并发 ...
在vs2008或vs2010构建汇编源...另外附上masm32 和 语法亮亮的usertype.dat文件。 注意我在masm32的配置好了intel 汇编语言程序设计书中要求的所有库文件。比较方便了。 压缩格式是.7z 这些资料适合和我一样的新手!
bb_reports 使用Pandas和Matplotlob创建支持数据的可视化数据自2017年以来,我们首先使用MS Excel收集所有支持数据。 当用户打进电话时,我们将在这些标题下收集以下信息: [“ ID”,“ Agent”,“ CallDateTime”...
Session的使用要求用户浏览器必须支持Cookie,如果浏览器不支持使用Cookie,或者设置为禁用Cookie,那么将不能使用Session。Session信息对客户来说,不同的用户用不同的Session信息来记录。当用户启用Session时,...
使用前请导入DumpStructureOnly.sql(数据库结构文件) 或者 DumpStructure_and_Data.sql(带有测试数据的数据库文件), 使用Navicat导入上述脚本至MySQL数据库 修改dbConn.java配置文件: 数据库端口:3306 ...
该项目是使用版本10.0.5生成的。 当前的启动用户进行测试 用户名 密码 用户类型 账户余额 abc123! UserType.basic 1000000 abc123! UserType.basic 2000 abc123! UserType.admin 1000000000 abc123! ...
需要使用这个:添加到 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封装日志操作类,可设置日志文件存储大小,超出限制新建日志;日志事件毫秒级打印。
专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在Model/View的便利类QTreeWidget、QListWidgetItem中的项类型分别是QTreeWidgetItem、QListWidgetItem,在构造这2个类型项的时候,可以指定一个type参数...
使用方法: 1.建立名字叫做"usertype.dat"的纯文本文件, 把以下关键字Copy到里面,一个关键字一行. 2.把此文件放到和VS IDE同目录下.(..\Microsoft Visual Studio X.0\Common7\IDE\) 3.打开VS, TOOL->OPTION-...
public String login(String userName,String userPw,int userType) { String result="no"; if(userType==0)//系统管理员登陆 { String sql="select * from t_admin where userName=? and userPw=?"; ...
: 具有所有信息管理模块的权限教师 : 具有学生信息管理模块的所有权限,但在教师信息管理模块中只具有查询及修改个人信息的权限学生 : 只具有查询并修改个人信息的权限设置权限的核心示例代码如下( 没有使用任何安全...
百度网盘mac