網上關于HIBERNATE自定義類型的文章很少,今天自己測試了一下,順便把代碼帖在這里


package?entiy;
import?java.sql.PreparedStatement;
import?java.sql.ResultSet;

public?interface?Email?{
????
????
????
public?int?[]?sqlTypes();???????????????? //映射的字段類型
????
public?Class?returnedClass();??????? //返回的數據類型
????
public?boolean?equals(Object?x,Object?y);??????????? //臟數據檢查時的方法
????
public??Object?nullSafeGet(ResultSet?rs,String?[]?names,Object?owern)?throws?Exception;?? //獲得數據類型
????
public??void???nullSafeSet(PreparedStatement?ps,Object?value,int?index)throws?Exception;?? //設置數據
????
????
public?Object?deepCopy(Object?value)?throws?Exception;??????????? //數據拷貝,用于在創建副本時調用
????
public?boolean?isMutable();
}




實際數據了類型

??1package?entiy;
??2import?java.io.Serializable;
??3import?java.sql.PreparedStatement;
??4import?java.sql.ResultSet;
??5import?java.util.ArrayList;
??6import?java.util.List;
??7
??8import?oracle.xdb.XMLType;
??9
?10import?org.apache.commons.lang.StringUtils;
?11import?org.hibernate.Hibernate;
?12
?13public?class?EmailList?implements?Email,Serializable?{?????????? //一定要實現Serializable,否則報錯:?could'nt determint emalist type
?14
?15????private?List?emailList;
?16
?17????private?static?final?char?split?=?';';
?18
?19????private?static?final?int[]?TYPES?=?new?int[]?{oracle.xdb.XMLType._SQL_TYPECODE?};?? //不同的數據庫,這里有不同:Types.varchar(mysql)
?20
?21????public?int[]?sqlTypes()?{
?22
?23????????return?TYPES;
?24????}

?25
?26????public?Class?returnedClass()?{
?27
?28????????return?List.class;
?29
?30????}

?31
?32????public?boolean?equals(Object?x,?Object?y)?{
?33
?34????????if?(x?==?y)
?35????????????return?true;
?36????????if?(x?!=?null?||?y?!=?null)?{
?37????????????List?xList?=?(List)?x;
?38????????????List?yList?=?(List)?y;
?39
?40????????????if?(xList.size()?!=?yList.size())
?41????????????????return?false;
?42????????????for?(int?i?=?0;?i?<?xList.size();?i++)?{
?43????????????????String?str1?=?(String)?xList.get(i);
?44????????????????String?str2?=?(String)?yList.get(i);
?45
?46????????????????if?(!str1.equals(str2))
?47????????????????????return?false;
?48
?49????????????}

?50????????????return?true;
?51
?52????????}

?53
?54????????return?false;
?55
?56????}

?57
?58????public?Object?nullSafeGet(ResultSet?rs,?String[]?names,?Object?owern)
?59????????????throws?Exception?{
?60
?61????????String?value?=?(String)?Hibernate.STRING.nullSafeGet(rs,?names[0]);
?62????????/*
?63?????????*?String?value=(String)?Hibernate.STRING.nullSafeGet(rs,names[0]);
?64?????????*?是獲取id列的值.
?65?????????*?
?66?????????*?其實這個東西可以這樣來看:JDBC代碼?rs.getString("id");
?67?????????*?
?68?????????*/

?69????????if?(value?!=?null)
?70????????????return?parse(value);
?71????????else
?72????????????return?null;
?73
?74????}

?75
?76????public?void?nullSafeSet(PreparedStatement?ps,?Object?value,?int?index)
?77????????????throws?Exception?{
?78????????System.out.println("Set?method?execute");
?79????????if?(value?!=?null)?{
?80????????????String?str?=?assemble((List)?value);
?81????????????Hibernate.STRING.nullSafeSet(ps,?str,?index);
?82
?83????????}
?else
?84????????????Hibernate.STRING.nullSafeSet(ps,?value,?index);
?85
?86????}

?87
?88????public?Object?deepCopy(Object?value)?throws?Exception?{
?89????????List?sourceList?=?(List)?value;
?90????????List?targetList?=?new?ArrayList();
?91????????targetList.addAll(sourceList);
?92????????return?targetList;
?93
?94????}

?95
?96????public?boolean?isMutable()?{
?97
?98????????return?false;
?99????}

100
101????public?String?assemble(List?list)?{
102
103????????StringBuffer?strbuf?=?new?StringBuffer();
104????????for?(int?i?=?0;?i?<?list.size()?-?1;?i++)?{
105
106????????????strbuf.append((String)?list.get(i)).append(split);
107????????}

108????????strbuf.append(list.get(list.size()?-?1));
109????????return?strbuf.toString();
110
111????}

112
113????public?List?parse(String?value)?{
114
115????????String[]?str?=?StringUtils.split(value,?split);
116????????List?list?=?new?ArrayList();
117????????for?(int?i?=?0;?i?<?str.length;?i++)?{
118????????????String?email?=?str[i];
119????????????list.add(email);
120
121????????}

122????????return?list;
123
124????}

125
126}

127


配置文件
?1<?xml?version="1.0"?>
?2<!DOCTYPE?hibernate-mapping?PUBLIC?
?3????"-//Hibernate/Hibernate?Mapping?DTD?3.0//EN"
?4????"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
?5
?6<hibernate-mapping
?7>
?8????<class
?9????????name="entiy.Tuser"
10????????table="Tuser"
11????????dynamic-update="false"
12????????dynamic-insert="false"
13????????select-before-update="false"
14????????optimistic-lock="version"
15????>
16
17????????<id
18????????????name="id"
19????????????column="id"
20????????????type="int"
21????????????unsaved-value="0"
22????????>
23???????????<generator?class="sequence">
24????????????????<param?name="sequence">TUSER_SEQ</param>
25????????????</generator>
26?????????????
27??????????
28????????</id>
29
30????????<property
31????????????name="name"
32????????????type="string"
33????????????update="true"
34????????????insert="true"
35????????????access="property"
36????????????column="name"
37????????????length="8"
38????????????not-null="false"
39????????/>
40????????
41????????
42?????????<property
43????????????name="email"
44????????????type="entiy.EmailList"???????????? //這里要注意一定得引入oracle包,否則或抱錯:couldnt determine the EmailList type
45????????????column="email"
46???????????
47????????/>
48
49??
50???????
51
52????????<!--
53????????????To?add?non?XDoclet?property?mappings,?create?a?file?named
54????????????????hibernate-properties-User.xml
55????????????containing?the?additional?properties?and?place?it?in?your?merge?dir.
56????????-->
57
58????</class>
59
60</hibernate-mapping>
61



注: 一定要引入.xmlparserv2.jar??? xdb.jar? nls_charset12.jar

?1import?java.io.File;
?2import?java.util.List;
?3
?4import?junit.framework.Assert;
?5import?junit.framework.TestCase;
?6
?7import?org.hibernate.Session;
?8import?org.hibernate.SessionFactory;
?9import?org.hibernate.Transaction;
10import?org.hibernate.cfg.Configuration;
11
12import?entiy.*;
13
14public?class?hibernateTest?extends?TestCase?{
15
16????Session?session?=?null;
17
18????protected?void?setUp()?throws?Exception?{
19
20????????try?{
21
22????????????File?flie?=?new?File(
23????????????????????"D:/workspace/HiberanteSample/hibernate.cfg.xml");
24????????????Configuration?config?=?new?Configuration().configure(flie);
25????????????SessionFactory?sessionfactory?=?config.buildSessionFactory();
26
27????????????session?=?sessionfactory.openSession();
28
29????????}
?catch?(Exception?e)?{
30????????????e.printStackTrace();
31????????}

32
33????}

34
35????protected?void?tearDown()?throws?Exception?{
36
37????????super.tearDown();
38????}

39
40????
41
42????public?void?testAddemail()?{
43
44????????try?{
45????????????Tuser?user?=?(Tuser)?session.get(Tuser.class,?new?Integer(2));
46????????????List?email?=?user.getEmail();
47????????????email.add("chang@163.com");
48????????????Transaction????tarn?=?session.beginTransaction();
49????????????session.save(user);
50????????????tarn.commit();
51????
52
53????????}
?catch?(Exception?e)?{
54????????????e.printStackTrace();
55????????}

56
57????}

58
59}

60